Bug#591717: espeak: found why device is invalid
Package: espeak
Version: 1.44.05-1
Severity: normal
I tried your advice with espeak 1.44.05-1.
I suggest you adopt the following patch, or else a modification of
espeak-data/config/pa_device is ignored.
-----------------------------------------------
@@ -496,7 +496,8 @@ void LoadConfig(void)
else
if(memcmp(buf,"pa_device",9)==0)
{
- sscanf(&buf[7],"%d",&option_device_number);
+ sscanf(&buf[10],"%d",&option_device_number);
}
else
if(memcmp(buf,"soundicon",9)==0)
-----------------------------------------------
Then, with espeak-data/config/pa_device set to 0 then 1,2,3,7, I got the
same following result with each value. At least the alsa device is
selected, and the message makes sense.
-----------------------------------------------
Expression 'SetApproximateSampleRate( pcm, hwParams, sr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1293
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1867
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1988
wave_open_sound > Pa_OpenStream : err=-9997 (Invalid sample rate)
Expression 'SetApproximateSampleRate( pcm, hwParams, sr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1293
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1867
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1988
Expression 'SetApproximateSampleRate( pcm, hwParams, sr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1293
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1867
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1988
wave_open_sound > Pa_OpenStream : err=-9997 (Invalid sample rate)
Expression 'SetApproximateSampleRate( pcm, hwParams, sr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1293
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1867
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1988
Expression 'SetApproximateSampleRate( pcm, hwParams, sr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1293
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1867
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1988
wave_open_sound > Pa_OpenStream : err=-9997 (Invalid sample rate)
Expression 'SetApproximateSampleRate( pcm, hwParams, sr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1293
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1867
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1988
Expression 'SetApproximateSampleRate( pcm, hwParams, sr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1293
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1867
Expression 'PaAlsaStream_Configure( stream, inputParameters, outputParameters, sampleRate, framesPerBuffer, &inputLatency, &outputLatency, &hostBufferSizeMode )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1988
wave_open_sound > Pa_OpenStream : err=-9997 (Invalid sample rate)
Expression 'SetApproximateSampleRate( pcm, hwParams, sr )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1293
Expression 'PaAlsaStreamComponent_InitialConfigure( &self->playback, outParams, self->primeBuffers, hwParamsPlayback, &realSr )' failed in '
-----------------------------------------------
For information, with this modification of src/wave.cpp
-----------------------------------------------
--- a/src/wave.cpp
+++ b/src/wave.cpp
@@ -568,6 +568,44 @@ static void select_device(const char* the_api)
update_output_parameters(i, deviceInfo);
}
+
+ printf ("\n\n");
+
+ printf ("option_device_number = %d\n", option_device_number);
+ printf ("Pa_GetVersion: %d\n", Pa_GetVersion ());
+ printf ("Pa_GetVersionText: %s\n", Pa_GetVersionText ());
+ printf ("Pa_GetDeviceCount = %d\n", Pa_GetDeviceCount());
+
+ { const PaHostApiIndex apicount = Pa_GetHostApiCount ();
+ if (apicount < 0) {
+ printf ("Pa_GetHostApiCount: %s\n", Pa_GetErrorText (apicount)); }
+ else {
+ for (PaHostApiIndex api=0; api<apicount; api++) {
+ const PaHostApiInfo * const apiinfo = Pa_GetHostApiInfo (api);
+ printf ("HostApi %d: name=%s device_count=%d default_output=%d\n",
+ api, apiinfo->name, apiinfo->deviceCount, apiinfo->defaultOutputDevice);
+ for (int apidevice=0; apidevice<apiinfo->deviceCount; apidevice++) {
+ printf (" api_device %d is port_audio_device %d\n",
+ apidevice, Pa_HostApiDeviceIndexToDeviceIndex (api, apidevice)); } } }}
+
+ { const PaHostApiIndex api = Pa_GetDefaultHostApi ();
+ if (api < 0) {
+ printf ("Pa_GetDefaultHostApi: %s\n", Pa_GetErrorText (api)); }
+ else {
+ printf ("Pa_GetDefaultHostApi %d\n", api); } }
+
+ { const PaDeviceIndex pa_device = Pa_GetDefaultOutputDevice ();
+ if (pa_device == paNoDevice) {
+ printf ("Pa_GetDefaultOutputDevice failed\n"); }
+ else {
+ printf ("Pa_GetDefaultOutputDevice %d\n", pa_device); } }
+
+ printf ("myOutputParameters.device: %d\n", myOutputParameters.device);
+
+ printf ("\n\n");
+
+
+
#endif
}
-------------------------------------------------------------------------
I've got
-----------------------------------
option_device_number = -1
Pa_GetVersion: 1899
Pa_GetVersionText: PortAudio V19-devel (built Nov 25 2010)
Pa_GetDeviceCount = 8
HostApi 0: name=OSS device_count=0 default_output=-1
HostApi 1: name=ALSA device_count=8 default_output=0
api_device 0 is port_audio_device 0
api_device 1 is port_audio_device 1
api_device 2 is port_audio_device 2
api_device 3 is port_audio_device 3
api_device 4 is port_audio_device 4
api_device 5 is port_audio_device 5
api_device 6 is port_audio_device 6
api_device 7 is port_audio_device 7
Pa_GetDefaultHostApi 0
Pa_GetDefaultOutputDevice failed
myOutputParameters.device: -1
wave_open_sound > Pa_OpenStream : err=-9996 (Invalid device)
wave_open_sound > Pa_OpenStream : err=-9996 (Invalid device)
wave_open_sound > Pa_OpenStream : err=-9996 (Invalid device)
wave_open_sound > Pa_OpenStream : err=-9996 (Invalid device)
--------------------------------------
I do not understand the imbricated tests in select_device() enough to
modify anything, but I guess that it could do better than set
myOutputParameters.device=-1
when pa_device == -1 (unset in espeak-data/config)
and Pa_GetDefaultOutputDevice() == -1 (portaudio fails to select a default output)
but there is a default output in the default host api.
In any case, if it does not select a valid device, it should not call
Pa_OpenStream() with a -1 device afterwards.
I hope that this will help.
Reply to: