Files
squeezelite-esp32/components/spotify/cspot/bell/main/audio-sinks/unix/PortAudioSink.cpp
T
2023-03-25 16:48:41 -07:00

66 lines
1.5 KiB
C++

#include "PortAudioSink.h"
PortAudioSink::PortAudioSink()
{
Pa_Initialize();
this->setParams(44100, 2, 16);
}
bool PortAudioSink::setParams(uint32_t sampleRate, uint8_t channelCount, uint8_t bitDepth) {
if (stream) {
Pa_StopStream(stream);
}
PaStreamParameters outputParameters;
outputParameters.device = Pa_GetDefaultOutputDevice();
if (outputParameters.device == paNoDevice) {
printf("PortAudio: Default audio device not found!\n");
// exit(0);
}
printf("PortAudio: Default audio device not found!\n");
outputParameters.channelCount = channelCount;
switch (bitDepth) {
case 32:
outputParameters.sampleFormat = paInt32;
break;
case 24:
outputParameters.sampleFormat = paInt24;
break;
case 16:
outputParameters.sampleFormat = paInt16;
break;
case 8:
outputParameters.sampleFormat = paInt8;
break;
default:
outputParameters.sampleFormat = paInt16;
break;
}
outputParameters.suggestedLatency = 0.050;
outputParameters.hostApiSpecificStreamInfo = NULL;
PaError err = Pa_OpenStream(
&stream,
NULL,
&outputParameters,
sampleRate,
4096 / (channelCount * bitDepth / 8),
paClipOff,
NULL, // blocking api
NULL
);
Pa_StartStream(stream);
return !err;
}
PortAudioSink::~PortAudioSink()
{
Pa_StopStream(stream);
Pa_Terminate();
}
void PortAudioSink::feedPCMFrames(const uint8_t *buffer, size_t bytes)
{
Pa_WriteStream(stream, buffer, bytes / 4);
}