mirror of
https://github.com/clangen/musikcube.git
synced 2025-02-11 09:40:26 +00:00
Update IOutput and IDecoder interfaces to allow for querying and setting default/preferred output sample rates. Nothing is wired up yet.
This commit is contained in:
parent
440a34b549
commit
f2e8fd45f8
@ -63,19 +63,20 @@ static const std::string defaultOutput = "PulseAudio";
|
||||
|
||||
class NoOutput: public IOutput {
|
||||
public:
|
||||
virtual void Release() { delete this; }
|
||||
virtual void Pause() { }
|
||||
virtual void Resume() { }
|
||||
virtual void SetVolume(double volume) { this->volume = volume; }
|
||||
virtual double GetVolume() { return this->volume; }
|
||||
virtual void Stop() { }
|
||||
virtual OutputState Play(IBuffer *buffer, IBufferProvider *provider) { return OutputState::InvalidState; }
|
||||
virtual void Drain() { }
|
||||
virtual double Latency() { return 0.0; }
|
||||
virtual const char* Name() { return "NoOutput"; }
|
||||
virtual IDeviceList* GetDeviceList() { return nullptr; }
|
||||
virtual bool SetDefaultDevice(const char* deviceId) { return false; }
|
||||
virtual IDevice* GetDefaultDevice() { return nullptr; }
|
||||
void Release() override { delete this; }
|
||||
void Pause() override { }
|
||||
void Resume() override { }
|
||||
void SetVolume(double volume) override { this->volume = volume; }
|
||||
double GetVolume() override { return this->volume; }
|
||||
void Stop() override { }
|
||||
OutputState Play(IBuffer *buffer, IBufferProvider *provider) override { return OutputState::InvalidState; }
|
||||
void Drain() override { }
|
||||
double Latency() override { return 0.0; }
|
||||
const char* Name() override { return "NoOutput"; }
|
||||
IDeviceList* GetDeviceList() override { return nullptr; }
|
||||
bool SetDefaultDevice(const char* deviceId) override { return false; }
|
||||
IDevice* GetDefaultDevice() override { return nullptr; }
|
||||
int GetDefaultSampleRate() override { return -1; }
|
||||
private:
|
||||
double volume{ 1.0f };
|
||||
};
|
||||
|
@ -47,6 +47,7 @@ namespace musik { namespace core { namespace sdk {
|
||||
virtual double GetDuration() = 0;
|
||||
virtual bool Open(IDataStream *stream) = 0;
|
||||
virtual bool Exhausted() = 0;
|
||||
virtual void SetPreferredSampleRate(int rate) = 0;
|
||||
};
|
||||
|
||||
} } }
|
||||
|
@ -55,6 +55,7 @@ namespace musik { namespace core { namespace sdk {
|
||||
virtual void Drain() = 0;
|
||||
virtual double Latency() = 0;
|
||||
virtual const char* Name() = 0;
|
||||
virtual int GetDefaultSampleRate() = 0;
|
||||
virtual IDeviceList* GetDeviceList() = 0;
|
||||
virtual bool SetDefaultDevice(const char* deviceId) = 0;
|
||||
virtual IDevice* GetDefaultDevice() = 0;
|
||||
|
@ -161,5 +161,5 @@ namespace musik {
|
||||
static const char* ExternalId = "external_id";
|
||||
}
|
||||
|
||||
static const int SdkVersion = 20;
|
||||
static const int SdkVersion = 21;
|
||||
} } }
|
||||
|
@ -51,25 +51,26 @@ class AlsaOut : public musik::core::sdk::IOutput {
|
||||
virtual ~AlsaOut();
|
||||
|
||||
/* IPlugin */
|
||||
virtual const char* Name() override { return "AlsaOut"; }
|
||||
const char* Name() override { return "AlsaOut"; }
|
||||
|
||||
/* IOutput */
|
||||
virtual void Release() override;
|
||||
virtual void Pause() override ;
|
||||
virtual void Resume() override;
|
||||
virtual void SetVolume(double volume) override;
|
||||
virtual double GetVolume() override;
|
||||
virtual void Stop() override;
|
||||
virtual double Latency() override;
|
||||
virtual void Drain() override;
|
||||
void Release() override;
|
||||
void Pause() override ;
|
||||
void Resume() override;
|
||||
void SetVolume(double volume) override;
|
||||
double GetVolume() override;
|
||||
void Stop() override;
|
||||
double Latency() override;
|
||||
void Drain() override;
|
||||
|
||||
virtual musik::core::sdk::OutputState Play(
|
||||
musik::core::sdk::OutputState Play(
|
||||
musik::core::sdk::IBuffer *buffer,
|
||||
musik::core::sdk::IBufferProvider *provider) override;
|
||||
|
||||
virtual musik::core::sdk::IDeviceList* GetDeviceList() override;
|
||||
virtual bool SetDefaultDevice(const char* deviceId) override;
|
||||
virtual musik::core::sdk::IDevice* GetDefaultDevice() override;
|
||||
musik::core::sdk::IDeviceList* GetDeviceList() override;
|
||||
bool SetDefaultDevice(const char* deviceId) override;
|
||||
musik::core::sdk::IDevice* GetDefaultDevice() override;
|
||||
int GetDefaultSampleRate() override { return -1; }
|
||||
|
||||
private:
|
||||
struct BufferContext {
|
||||
|
@ -50,6 +50,7 @@ class CddaDecoder : public IDecoder {
|
||||
double GetDuration() override;
|
||||
bool GetBuffer(IBuffer *buffer) override;
|
||||
bool Exhausted() noexcept override { return this->exhausted; }
|
||||
void SetPreferredSampleRate(int rate) override { }
|
||||
|
||||
private:
|
||||
CddaDataStream* data;
|
||||
|
@ -55,25 +55,26 @@ class CoreAudioOut : public musik::core::sdk::IOutput {
|
||||
virtual ~CoreAudioOut();
|
||||
|
||||
/* IPlugin */
|
||||
virtual const char* Name() override { return "CoreAudio"; }
|
||||
const char* Name() override { return "CoreAudio"; }
|
||||
|
||||
/* IOutput */
|
||||
virtual void Release() override;
|
||||
virtual void Pause() override;
|
||||
virtual void Resume() override;
|
||||
virtual void SetVolume(double volume) override;
|
||||
virtual double GetVolume() override;
|
||||
virtual void Stop() override;
|
||||
virtual double Latency() override { return 0.0; }
|
||||
virtual void Drain() override;
|
||||
void Release() override;
|
||||
void Pause() override;
|
||||
void Resume() override;
|
||||
void SetVolume(double volume) override;
|
||||
double GetVolume() override;
|
||||
void Stop() override;
|
||||
double Latency() override { return 0.0; }
|
||||
void Drain() override;
|
||||
|
||||
virtual musik::core::sdk::OutputState Play(
|
||||
musik::core::sdk::OutputState Play(
|
||||
musik::core::sdk::IBuffer *buffer,
|
||||
musik::core::sdk::IBufferProvider *provider) override;
|
||||
|
||||
virtual musik::core::sdk::IDeviceList* GetDeviceList() override;
|
||||
virtual bool SetDefaultDevice(const char* deviceId) override;
|
||||
virtual musik::core::sdk::IDevice* GetDefaultDevice() override;
|
||||
musik::core::sdk::IDeviceList* GetDeviceList() override;
|
||||
bool SetDefaultDevice(const char* deviceId) override;
|
||||
musik::core::sdk::IDevice* GetDefaultDevice() override;
|
||||
int GetDefaultSampleRate() override { return -1; }
|
||||
|
||||
void NotifyBufferCompleted(BufferContext *context);
|
||||
|
||||
|
@ -57,21 +57,22 @@ class DirectSoundOut : public IOutput {
|
||||
~DirectSoundOut();
|
||||
|
||||
/* IPlugin */
|
||||
virtual const char* Name() { return "DirectSound"; };
|
||||
virtual void Release();
|
||||
const char* Name() override { return "DirectSound"; };
|
||||
void Release() override;
|
||||
|
||||
/* IOutput */
|
||||
virtual void Pause() override;
|
||||
virtual void Resume() override;
|
||||
virtual void SetVolume(double volume) override;
|
||||
virtual double GetVolume() override;
|
||||
virtual void Stop() override;
|
||||
virtual OutputState Play(IBuffer *buffer, IBufferProvider *provider) override;
|
||||
virtual double Latency() override;
|
||||
virtual void Drain() override;
|
||||
virtual IDeviceList* GetDeviceList() override;
|
||||
virtual bool SetDefaultDevice(const char* deviceId) override;
|
||||
virtual IDevice* GetDefaultDevice() override;
|
||||
void Pause() override;
|
||||
void Resume() override;
|
||||
void SetVolume(double volume) override;
|
||||
double GetVolume() override;
|
||||
void Stop() override;
|
||||
OutputState Play(IBuffer *buffer, IBufferProvider *provider) override;
|
||||
double Latency() override;
|
||||
void Drain() override;
|
||||
IDeviceList* GetDeviceList() override;
|
||||
bool SetDefaultDevice(const char* deviceId) override;
|
||||
IDevice* GetDefaultDevice() override;
|
||||
int GetDefaultSampleRate() override { return -1; }
|
||||
|
||||
private:
|
||||
enum State {
|
||||
|
@ -58,12 +58,13 @@ class FfmpegDecoder: public musik::core::sdk::IDecoder {
|
||||
FfmpegDecoder();
|
||||
~FfmpegDecoder();
|
||||
|
||||
virtual void Release() override;
|
||||
virtual double SetPosition(double seconds) override;
|
||||
virtual bool GetBuffer(IBuffer *buffer) override;
|
||||
virtual double GetDuration() override;
|
||||
virtual bool Open(musik::core::sdk::IDataStream *stream) override;
|
||||
virtual bool Exhausted() override;
|
||||
void Release() override;
|
||||
double SetPosition(double seconds) override;
|
||||
bool GetBuffer(IBuffer *buffer) override;
|
||||
double GetDuration() override;
|
||||
bool Open(musik::core::sdk::IDataStream *stream) override;
|
||||
bool Exhausted() override;
|
||||
void SetPreferredSampleRate(int rate) override { }
|
||||
|
||||
IDataStream* Stream() { return this->stream; }
|
||||
|
||||
|
@ -47,12 +47,13 @@ class FlacDecoder: public musik::core::sdk::IDecoder {
|
||||
FlacDecoder();
|
||||
~FlacDecoder();
|
||||
|
||||
virtual void Release() override;
|
||||
virtual double SetPosition(double seconds) override;
|
||||
virtual bool GetBuffer(IBuffer *buffer) override;
|
||||
virtual double GetDuration() override;
|
||||
virtual bool Open(musik::core::sdk::IDataStream *stream) override;
|
||||
virtual bool Exhausted() override { return this->exhausted; }
|
||||
void Release() override;
|
||||
double SetPosition(double seconds) override;
|
||||
bool GetBuffer(IBuffer *buffer) override;
|
||||
double GetDuration() override;
|
||||
bool Open(musik::core::sdk::IDataStream *stream) override;
|
||||
bool Exhausted() override { return this->exhausted; }
|
||||
void SetPreferredSampleRate(int rate) override { }
|
||||
|
||||
private:
|
||||
static FLAC__StreamDecoderReadStatus FlacRead(
|
||||
|
@ -49,12 +49,13 @@ class GmeDecoder: public musik::core::sdk::IDecoder {
|
||||
GmeDecoder();
|
||||
virtual ~GmeDecoder();
|
||||
|
||||
virtual void Release() override;
|
||||
virtual double SetPosition(double seconds) override;
|
||||
virtual bool GetBuffer(IBuffer *buffer) override;
|
||||
virtual double GetDuration() override;
|
||||
virtual bool Open(musik::core::sdk::IDataStream *stream) override;
|
||||
virtual bool Exhausted() override;
|
||||
void Release() override;
|
||||
double SetPosition(double seconds) override;
|
||||
bool GetBuffer(IBuffer *buffer) override;
|
||||
double GetDuration() override;
|
||||
bool Open(musik::core::sdk::IDataStream *stream) override;
|
||||
bool Exhausted() override;
|
||||
void SetPreferredSampleRate(int rate) override { }
|
||||
|
||||
private:
|
||||
GmeDataStream* stream { nullptr };
|
||||
|
@ -53,6 +53,7 @@ class OpenMptDecoder: public musik::core::sdk::IDecoder {
|
||||
double GetDuration() override;
|
||||
bool Open(musik::core::sdk::IDataStream* stream) override;
|
||||
bool Exhausted() override;
|
||||
void SetPreferredSampleRate(int rate) override { }
|
||||
|
||||
musik::core::sdk::IDataStream* Stream() { return this->stream; }
|
||||
|
||||
|
@ -43,12 +43,13 @@ class M4aDecoder : public musik::core::sdk::IDecoder {
|
||||
M4aDecoder();
|
||||
~M4aDecoder();
|
||||
|
||||
virtual void Release() override;
|
||||
virtual double SetPosition(double seconds) override;
|
||||
virtual bool GetBuffer(musik::core::sdk::IBuffer *buffer) override;
|
||||
virtual double GetDuration() override;
|
||||
virtual bool Open(musik::core::sdk::IDataStream *stream) override;
|
||||
virtual bool Exhausted() override { return this->exhausted; }
|
||||
void Release() override;
|
||||
double SetPosition(double seconds) override;
|
||||
bool GetBuffer(musik::core::sdk::IBuffer *buffer) override;
|
||||
double GetDuration() override;
|
||||
bool Open(musik::core::sdk::IDataStream *stream) override;
|
||||
bool Exhausted() override { return this->exhausted; }
|
||||
void SetPreferredSampleRate(int rate) override { }
|
||||
|
||||
private:
|
||||
NeAACDecHandle decoder;
|
||||
|
@ -44,11 +44,12 @@ class Mpg123Decoder : public musik::core::sdk::IDecoder {
|
||||
Mpg123Decoder();
|
||||
virtual ~Mpg123Decoder();
|
||||
|
||||
virtual bool Open(musik::core::sdk::IDataStream *dataStream);
|
||||
virtual double SetPosition(double seconds);
|
||||
virtual bool GetBuffer(musik::core::sdk::IBuffer *buffer);
|
||||
virtual void Destroy();
|
||||
virtual double GetDuration();
|
||||
bool Open(musik::core::sdk::IDataStream *dataStream) override;
|
||||
double SetPosition(double seconds) override;
|
||||
bool GetBuffer(musik::core::sdk::IBuffer *buffer) override;
|
||||
void Destroy() override;
|
||||
double GetDuration() override;
|
||||
void SetPreferredSampleRate(int rate) override { }
|
||||
|
||||
private:
|
||||
bool Feed();
|
||||
|
@ -46,12 +46,13 @@ class NomadDecoder : public musik::core::sdk::IDecoder {
|
||||
NomadDecoder();
|
||||
~NomadDecoder();
|
||||
|
||||
virtual bool Open(musik::core::sdk::IDataStream *dataStream) override;
|
||||
virtual double SetPosition(double seconds) override;
|
||||
virtual bool GetBuffer(musik::core::sdk::IBuffer *buffer) override;
|
||||
virtual double GetDuration() override;
|
||||
virtual void Release() override;
|
||||
virtual bool Exhausted() override { return this->exhausted; }
|
||||
bool Open(musik::core::sdk::IDataStream *dataStream) override;
|
||||
double SetPosition(double seconds) override;
|
||||
bool GetBuffer(musik::core::sdk::IBuffer *buffer) override;
|
||||
double GetDuration() override;
|
||||
void Release() override;
|
||||
bool Exhausted() override { return this->exhausted; }
|
||||
void SetPreferredSampleRate(int rate) override { }
|
||||
|
||||
private:
|
||||
size_t GetId3v2HeaderLength(musik::core::sdk::IDataStream *stream);
|
||||
|
@ -61,6 +61,7 @@ class NullOut : public IOutput {
|
||||
IDeviceList* GetDeviceList() override;
|
||||
bool SetDefaultDevice(const char* deviceId) override;
|
||||
IDevice* GetDefaultDevice() override;
|
||||
int GetDefaultSampleRate() override { return -1; }
|
||||
|
||||
private:
|
||||
enum State {
|
||||
|
@ -45,12 +45,13 @@ class OggDecoder : public IDecoder {
|
||||
OggDecoder();
|
||||
~OggDecoder();
|
||||
|
||||
virtual void Release() override;
|
||||
virtual double SetPosition(double second) override;
|
||||
virtual bool GetBuffer(IBuffer *buffer) override;
|
||||
virtual double GetDuration() override;
|
||||
virtual bool Open(musik::core::sdk::IDataStream *fileStream) override;
|
||||
virtual bool Exhausted() override { return this->exhausted; }
|
||||
void Release() override;
|
||||
double SetPosition(double second) override;
|
||||
bool GetBuffer(IBuffer *buffer) override;
|
||||
double GetDuration() override;
|
||||
bool Open(musik::core::sdk::IDataStream *fileStream) override;
|
||||
bool Exhausted() override { return this->exhausted; }
|
||||
void SetPreferredSampleRate(int rate) override { }
|
||||
|
||||
/* libvorbis callbacks */
|
||||
static size_t OggRead(void *buffer, size_t nofParts, size_t partSize, void *datasource);
|
||||
|
@ -66,6 +66,7 @@ class PipeWireOut : public IOutput {
|
||||
IDeviceList* GetDeviceList() override;
|
||||
bool SetDefaultDevice(const char* deviceId) override;
|
||||
IDevice* GetDefaultDevice() override;
|
||||
int GetDefaultSampleRate() override { return -1; }
|
||||
|
||||
private:
|
||||
bool StartPipeWire(IBuffer* buffer);
|
||||
|
@ -47,25 +47,26 @@ class PulseOut : public musik::core::sdk::IOutput {
|
||||
virtual ~PulseOut();
|
||||
|
||||
/* IPlugin */
|
||||
virtual const char* Name() override { return "PulseAudio"; }
|
||||
const char* Name() override { return "PulseAudio"; }
|
||||
|
||||
/* IOutput */
|
||||
virtual void Release() override;
|
||||
virtual void Pause() override;
|
||||
virtual void Resume() override;
|
||||
virtual void SetVolume(double volume) override;
|
||||
virtual double GetVolume() override;
|
||||
virtual void Stop() override;
|
||||
virtual double Latency() override;
|
||||
virtual void Drain() override;
|
||||
void Release() override;
|
||||
void Pause() override;
|
||||
void Resume() override;
|
||||
void SetVolume(double volume) override;
|
||||
double GetVolume() override;
|
||||
void Stop() override;
|
||||
double Latency() override;
|
||||
void Drain() override;
|
||||
|
||||
virtual musik::core::sdk::OutputState Play(
|
||||
musik::core::sdk::OutputState Play(
|
||||
musik::core::sdk::IBuffer *buffer,
|
||||
musik::core::sdk::IBufferProvider *provider) override;
|
||||
|
||||
virtual musik::core::sdk::IDeviceList* GetDeviceList() override;
|
||||
virtual bool SetDefaultDevice(const char* deviceId) override;
|
||||
virtual musik::core::sdk::IDevice* GetDefaultDevice() override;
|
||||
musik::core::sdk::IDeviceList* GetDeviceList() override;
|
||||
bool SetDefaultDevice(const char* deviceId) override;
|
||||
musik::core::sdk::IDevice* GetDefaultDevice() override;
|
||||
int GetDefaultSampleRate() override { return -1; }
|
||||
|
||||
private:
|
||||
enum State {
|
||||
|
@ -50,21 +50,22 @@ class SndioOut : public IOutput {
|
||||
~SndioOut();
|
||||
|
||||
/* IPlugin */
|
||||
virtual const char* Name() override { return "sndio"; };
|
||||
virtual void Release() override;
|
||||
const char* Name() override { return "sndio"; };
|
||||
void Release() override;
|
||||
|
||||
/* IOutput */
|
||||
virtual void Pause() override;
|
||||
virtual void Resume() override;
|
||||
virtual void SetVolume(double volume) override;
|
||||
virtual double GetVolume() override;
|
||||
virtual void Stop() override;
|
||||
virtual musik::core::sdk::OutputState Play(IBuffer *buffer, IBufferProvider *provider) override;
|
||||
virtual double Latency() override;
|
||||
virtual void Drain() override;
|
||||
virtual IDeviceList* GetDeviceList() override;
|
||||
virtual bool SetDefaultDevice(const char* deviceId) override;
|
||||
virtual IDevice* GetDefaultDevice() override;
|
||||
void Pause() override;
|
||||
void Resume() override;
|
||||
void SetVolume(double volume) override;
|
||||
double GetVolume() override;
|
||||
void Stop() override;
|
||||
musik::core::sdk::OutputState Play(IBuffer *buffer, IBufferProvider *provider) override;
|
||||
double Latency() override;
|
||||
void Drain() override;
|
||||
IDeviceList* GetDeviceList() override;
|
||||
bool SetDefaultDevice(const char* deviceId) override;
|
||||
IDevice* GetDefaultDevice() override;
|
||||
int GetDefaultSampleRate() override { return -1; }
|
||||
|
||||
private:
|
||||
enum class Command: int {
|
||||
|
@ -55,21 +55,21 @@ class WasapiOut : public IOutput {
|
||||
~WasapiOut();
|
||||
|
||||
/* IPlugin */
|
||||
virtual const char* Name() { return "WASAPI"; };
|
||||
virtual void Release();
|
||||
const char* Name() override { return "WASAPI"; };
|
||||
void Release() override;
|
||||
|
||||
/* IOutput */
|
||||
virtual void Pause() override;
|
||||
virtual void Resume() override;
|
||||
virtual void SetVolume(double volume) override;
|
||||
virtual double GetVolume() override;
|
||||
virtual void Stop() override;
|
||||
virtual OutputState Play(IBuffer *buffer, IBufferProvider *provider) override;
|
||||
virtual double Latency() override;
|
||||
virtual void Drain() override;
|
||||
virtual IDeviceList* GetDeviceList() override;
|
||||
virtual bool SetDefaultDevice(const char* deviceId) override;
|
||||
virtual IDevice* GetDefaultDevice() override;
|
||||
void Pause() override;
|
||||
void Resume() override;
|
||||
void SetVolume(double volume) override;
|
||||
double GetVolume() override;
|
||||
void Stop() override;
|
||||
OutputState Play(IBuffer *buffer, IBufferProvider *provider) override;
|
||||
double Latency() override;
|
||||
void Drain() override;
|
||||
IDeviceList* GetDeviceList() override;
|
||||
bool SetDefaultDevice(const char* deviceId) override;
|
||||
IDevice* GetDefaultDevice() override;
|
||||
|
||||
void OnDeviceChanged() { this->deviceChanged = true; }
|
||||
|
||||
|
@ -51,21 +51,22 @@ class WaveOut : public IOutput {
|
||||
~WaveOut();
|
||||
|
||||
/* IPlugin */
|
||||
virtual const char* Name() { return "WaveOut"; };
|
||||
virtual void Release();
|
||||
const char* Name() override { return "WaveOut"; };
|
||||
void Release() override;
|
||||
|
||||
/* IOutput */
|
||||
virtual void Pause() override;
|
||||
virtual void Resume() override;
|
||||
virtual void SetVolume(double volume) override;
|
||||
virtual double GetVolume() override;
|
||||
virtual void Stop() override;
|
||||
virtual OutputState Play(IBuffer *buffer, IBufferProvider *provider) override;
|
||||
virtual double Latency() override { return 0.0; }
|
||||
virtual void Drain() override { }
|
||||
virtual IDeviceList* GetDeviceList() override;
|
||||
virtual bool SetDefaultDevice(const char* deviceId) override;
|
||||
virtual IDevice* GetDefaultDevice() override;
|
||||
void Pause() override;
|
||||
void Resume() override;
|
||||
void SetVolume(double volume) override;
|
||||
double GetVolume() override;
|
||||
void Stop() override;
|
||||
OutputState Play(IBuffer *buffer, IBufferProvider *provider) override;
|
||||
double Latency() override { return 0.0; }
|
||||
void Drain() override { }
|
||||
IDeviceList* GetDeviceList() override;
|
||||
bool SetDefaultDevice(const char* deviceId) override;
|
||||
IDevice* GetDefaultDevice() override;
|
||||
int GetDefaultSampleRate() override { return -1; }
|
||||
|
||||
void OnBufferWrittenToOutput(WaveOutBuffer *buffer);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user