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