Browse Source

wave: make use of the device parameter to wave_open

master
Reece H. Dunn 9 years ago
parent
commit
5a793e4dea
1 changed files with 32 additions and 48 deletions
  1. 32
    48
      src/libespeak-ng/wave.c

+ 32
- 48
src/libespeak-ng/wave.c View File

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


Loading…
Cancel
Save