|
|
@@ -213,6 +213,7 @@ static int wave_samplerate; |
|
|
|
|
|
|
|
static int mInCallbackFinishedState = false; |
|
|
|
#if (USE_PORTAUDIO == 18) |
|
|
|
static PaDeviceID myOutputDevice = 0; |
|
|
|
static PortAudioStream *pa_stream = NULL; |
|
|
|
#endif |
|
|
|
#if (USE_PORTAUDIO == 19) |
|
|
@@ -396,8 +397,6 @@ static int wave_open_sound() |
|
|
|
out_channels = 1; |
|
|
|
|
|
|
|
#if USE_PORTAUDIO == 18 |
|
|
|
PaDeviceID playbackDevice = Pa_GetDefaultOutputDeviceID(); |
|
|
|
|
|
|
|
err = Pa_OpenStream(&pa_stream, |
|
|
|
// capture parameters |
|
|
|
paNoDevice, |
|
|
@@ -405,7 +404,7 @@ static int wave_open_sound() |
|
|
|
paInt16, |
|
|
|
NULL, |
|
|
|
// playback parameters |
|
|
|
playbackDevice, |
|
|
|
myOutputDevice, |
|
|
|
out_channels, |
|
|
|
paInt16, |
|
|
|
NULL, |
|
|
@@ -424,7 +423,7 @@ static int wave_open_sound() |
|
|
|
paInt16, |
|
|
|
NULL, |
|
|
|
// playback parameters |
|
|
|
playbackDevice, |
|
|
|
myOutputDevice, |
|
|
|
out_channels, |
|
|
|
paInt16, |
|
|
|
NULL, |
|
|
@@ -478,9 +477,9 @@ static int wave_open_sound() |
|
|
|
return err != paNoError; |
|
|
|
} |
|
|
|
|
|
|
|
#if (USE_PORTAUDIO == 19) |
|
|
|
static void update_output_parameters(int selectedDevice, const PaDeviceInfo *deviceInfo) |
|
|
|
{ |
|
|
|
#if (USE_PORTAUDIO == 19) |
|
|
|
myOutputParameters.device = selectedDevice; |
|
|
|
myOutputParameters.channelCount = 1; |
|
|
|
myOutputParameters.sampleFormat = paInt16; |
|
|
@@ -495,17 +494,26 @@ static void update_output_parameters(int selectedDevice, const PaDeviceInfo *dev |
|
|
|
myOutputParameters.suggestedLatency = (double)0.1; // 100ms |
|
|
|
|
|
|
|
myOutputParameters.hostApiSpecificStreamInfo = NULL; |
|
|
|
} |
|
|
|
#else |
|
|
|
myOutputDevice = selectedDevice; |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
static void select_device() |
|
|
|
static const PaDeviceInfo *select_device(const char *device) |
|
|
|
{ |
|
|
|
#if (USE_PORTAUDIO == 19) |
|
|
|
int numDevices = Pa_GetDeviceCount(); |
|
|
|
#else |
|
|
|
int numDevices = Pa_CountDevices(); |
|
|
|
#endif |
|
|
|
if (numDevices < 0) |
|
|
|
assert(0); |
|
|
|
return NULL; |
|
|
|
|
|
|
|
PaDeviceIndex i = 0, selectedIndex = 0, defaultAlsaIndex = numDevices; |
|
|
|
#if (USE_PORTAUDIO == 19) |
|
|
|
PaDeviceIndex i = 0, selectedIndex = 0; |
|
|
|
#else |
|
|
|
PaDeviceID i = 0, selectedIndex = 0; |
|
|
|
#endif |
|
|
|
const PaDeviceInfo *deviceInfo = NULL; |
|
|
|
const PaDeviceInfo *selectedDeviceInfo = NULL; |
|
|
|
|
|
|
@@ -514,52 +522,29 @@ static void select_device() |
|
|
|
selectedDeviceInfo = Pa_GetDeviceInfo(selectedIndex); |
|
|
|
} |
|
|
|
|
|
|
|
if (device == NULL) { |
|
|
|
#if (USE_PORTAUDIO == 19) |
|
|
|
selectedIndex = Pa_GetDefaultOutputDevice(); |
|
|
|
#else |
|
|
|
selectedIndex = Pa_GetDefaultOutputDeviceID(); |
|
|
|
#endif |
|
|
|
selectedDeviceInfo = Pa_GetDeviceInfo(selectedIndex); |
|
|
|
} |
|
|
|
|
|
|
|
if (selectedDeviceInfo == NULL) { |
|
|
|
for (i = 0; i < numDevices; i++) { |
|
|
|
deviceInfo = Pa_GetDeviceInfo(i); |
|
|
|
|
|
|
|
if (deviceInfo == NULL) |
|
|
|
break; |
|
|
|
const PaHostApiInfo *hostInfo = Pa_GetHostApiInfo(deviceInfo->hostApi); |
|
|
|
|
|
|
|
if (hostInfo && hostInfo->type == paALSA) { |
|
|
|
// Check (once) the default output device |
|
|
|
if (defaultAlsaIndex == numDevices) { |
|
|
|
defaultAlsaIndex = hostInfo->defaultOutputDevice; |
|
|
|
const PaDeviceInfo *deviceInfo = Pa_GetDeviceInfo(defaultAlsaIndex); |
|
|
|
update_output_parameters(defaultAlsaIndex, deviceInfo); |
|
|
|
if (Pa_IsFormatSupported(NULL, &myOutputParameters, wave_samplerate) == 0) { |
|
|
|
selectedIndex = defaultAlsaIndex; |
|
|
|
selectedDeviceInfo = deviceInfo; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// if the default output device does not match, |
|
|
|
// look for the device with the highest number of output channels |
|
|
|
|
|
|
|
update_output_parameters(i, deviceInfo); |
|
|
|
|
|
|
|
if (Pa_IsFormatSupported(NULL, &myOutputParameters, wave_samplerate) == 0) { |
|
|
|
if (!selectedDeviceInfo |
|
|
|
|| (selectedDeviceInfo->maxOutputChannels < deviceInfo->maxOutputChannels)) { |
|
|
|
selectedIndex = i; |
|
|
|
selectedDeviceInfo = deviceInfo; |
|
|
|
} |
|
|
|
} |
|
|
|
if (deviceInfo != NULL && !strcmp(device, deviceInfo->name)) { |
|
|
|
selectedIndex = i; |
|
|
|
selectedDeviceInfo = deviceInfo; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (selectedDeviceInfo) |
|
|
|
update_output_parameters(selectedIndex, selectedDeviceInfo); |
|
|
|
else { |
|
|
|
i = Pa_GetDefaultOutputDevice(); |
|
|
|
deviceInfo = Pa_GetDeviceInfo(i); |
|
|
|
update_output_parameters(i, deviceInfo); |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
return selectedDeviceInfo; |
|
|
|
} |
|
|
|
|
|
|
|
void wave_set_callback_is_output_enabled(t_wave_callback *cb) |
|
|
@@ -569,8 +554,6 @@ void wave_set_callback_is_output_enabled(t_wave_callback *cb) |
|
|
|
|
|
|
|
void *wave_open(int srate, const char *device) |
|
|
|
{ |
|
|
|
(void)device; // unused |
|
|
|
|
|
|
|
PaError err; |
|
|
|
|
|
|
|
pa_stream = NULL; |
|
|
@@ -587,7 +570,8 @@ void *wave_open(int srate, const char *device) |
|
|
|
static int once = 0; |
|
|
|
|
|
|
|
if (!once) { |
|
|
|
select_device(); |
|
|
|
if (!select_device(device)) |
|
|
|
return NULL; |
|
|
|
once = 1; |
|
|
|
} |
|
|
|
|