// Copyright (c) 2026 - 2026 kio@little-bat.de
// BSD-2-Clause license
// https://opensource.org/licenses/BSD-2-Clause

#pragma once
#include "Audio.h"
#include "AudioPlayer.h"
#include "AudioSource.h"
#include "common/standard_types.h"
#include "libmad/MadFrame.h"
#include "libmad/MadStream.h"
#include "libmad/MadSynth.h"

namespace kilipili::Audio
{

class Mp3Player : public AudioPlayer
{
	Id("Mp3Player");

public:
	Mp3Player();
	virtual ~Mp3Player() noexcept;
	Mp3Player(const Mp3Player&) = delete;

	// run state machine to play the file:
	int run() noexcept;

	void  setFpos(float seconds); // todo
	float getSize();			  // todo
	float getFpos();			  // todo
	void  setVolume(float);		  // todo
	cstr  getFilename();		  // todo

	virtual void header(const MadHeader*) {}			// optional
	virtual void filter(const MadStream*, MadFrame*) {} // optional

	struct Buffer
	{
		static constexpr uint size = 2000;

		void   reset() noexcept { count = 0; }
		uchar  data[size]; // input stream buffer
		uint16 count = 0;
		int16  rc	 = 0;
	};
	RCPtr<Buffer>	 buffer; // stream buffer for mp3 decoder
	RCPtr<MadSynth>	 synth;	 // size > 13 kB
	RCPtr<MadFrame>	 frame;	 // size > 9 kB
	RCPtr<MadStream> stream; // size ~ 100 byte

	using AudioAdapter = PipedAdapter<hw_num_channels, 2 kB>;
	RCPtr<AudioAdapter> output_adapter;

	uint   sample_rate {0};
	uchar  options {0};
	uchar  rc {0}; // RCPtr<>
	uchar  state {0};
	ushort nsamples_done;
};


} // namespace kilipili::Audio
