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:
casey langen 2021-09-19 21:00:59 -07:00
parent 440a34b549
commit f2e8fd45f8
22 changed files with 166 additions and 146 deletions

View File

@ -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 };
};

View File

@ -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;
};
} } }

View File

@ -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;

View File

@ -161,5 +161,5 @@ namespace musik {
static const char* ExternalId = "external_id";
}
static const int SdkVersion = 20;
static const int SdkVersion = 21;
} } }

View File

@ -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 {

View File

@ -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;

View File

@ -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);

View File

@ -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 {

View File

@ -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; }

View File

@ -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(

View File

@ -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 };

View File

@ -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; }

View File

@ -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;

View File

@ -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();

View File

@ -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);

View File

@ -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 {

View File

@ -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);

View File

@ -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);

View File

@ -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 {

View File

@ -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 {

View File

@ -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; }

View File

@ -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);