[Freeswitch-svn] [commit] r11351 - freeswitch/trunk/src/mod/endpoints/mod_portaudio

FreeSWITCH SVN anthm at freeswitch.org
Wed Jan 21 19:14:08 PST 2009


Author: anthm
Date: Wed Jan 21 21:14:08 2009
New Revision: 11351

Log:
fuggit

Modified:
   freeswitch/trunk/src/mod/endpoints/mod_portaudio/mod_portaudio.c
   freeswitch/trunk/src/mod/endpoints/mod_portaudio/pablio.c

Modified: freeswitch/trunk/src/mod/endpoints/mod_portaudio/mod_portaudio.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_portaudio/mod_portaudio.c	(original)
+++ freeswitch/trunk/src/mod/endpoints/mod_portaudio/mod_portaudio.c	Wed Jan 21 21:14:08 2009
@@ -42,8 +42,8 @@
 
 SWITCH_MODULE_LOAD_FUNCTION(mod_portaudio_load);
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_portaudio_shutdown);
-SWITCH_MODULE_RUNTIME_FUNCTION(mod_portaudio_runtime);
-SWITCH_MODULE_DEFINITION(mod_portaudio, mod_portaudio_load, mod_portaudio_shutdown, mod_portaudio_runtime);
+//SWITCH_MODULE_RUNTIME_FUNCTION(mod_portaudio_runtime);
+SWITCH_MODULE_DEFINITION(mod_portaudio, mod_portaudio_load, mod_portaudio_shutdown, NULL);
 
 static switch_memory_pool_t *module_pool = NULL;
 switch_endpoint_interface_t *portaudio_endpoint_interface;
@@ -200,7 +200,7 @@
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s CHANNEL INIT %d %d\n",
 						  switch_channel_get_name(channel), switch_channel_get_state(channel), switch_test_flag(tech_pvt, TFLAG_ANSWER));
 
-		if (engage_device(tech_pvt->sample_rate, tech_pvt->codec_ms) != SWITCH_STATUS_SUCCESS) {
+		if (engage_device(globals.sample_rate, globals.codec_ms) != SWITCH_STATUS_SUCCESS) {
 			switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
 			return SWITCH_STATUS_FALSE;
 		}
@@ -243,6 +243,7 @@
 			switch_channel_mark_answered(channel);
 			switch_set_flag(tech_pvt, TFLAG_ANSWER);
 			switch_mutex_unlock(globals.pvt_lock);
+			switch_yield(1000000);
 		} else {
 			switch_core_session_queue_indication(session, SWITCH_MESSAGE_INDICATE_RINGING);
 			switch_channel_mark_ring_ready(channel);
@@ -334,6 +335,14 @@
 		globals.audio_stream = NULL;
 	}
 
+	/* UNLOCKED ************************************************************************************************* */
+	switch_mutex_unlock(globals.device_lock);
+}
+
+
+static void destroy_codecs(void) 
+{
+
 	if (globals.read_codec.implementation) {
 		switch_core_codec_destroy(&globals.read_codec);
 	}
@@ -350,11 +359,10 @@
 		switch_core_timer_destroy(&globals.hold_timer);
 	}
 
-	/* UNLOCKED ************************************************************************************************* */
-	switch_mutex_unlock(globals.device_lock);
-}
 
 
+}
+
 static void deactivate_ring_device(void)
 {
 	if (!globals.ring_stream) {
@@ -413,6 +421,8 @@
 		}
 	}
 
+	globals.deactivate_timer = 0;
+
 	switch_mutex_unlock(globals.pvt_lock);
 }
 
@@ -537,7 +547,7 @@
 			switch_size_t olen = globals.read_codec.implementation->samples_per_packet;
 			
 			if (!tech_pvt->hfh) {
-				int sample_rate = tech_pvt->sample_rate ? tech_pvt->sample_rate : globals.sample_rate;
+				int sample_rate = globals.sample_rate;
 				if (switch_core_file_open(&tech_pvt->fh,
 										  tech_pvt->hold_file,
 										  globals.read_codec.implementation->number_of_channels,
@@ -693,6 +703,7 @@
 													switch_caller_profile_t *outbound_profile,
 													switch_core_session_t **new_session, switch_memory_pool_t **pool, switch_originate_flag_t flags)
 {
+
 	if ((*new_session = switch_core_session_request(portaudio_endpoint_interface, pool)) != 0) {
 		private_t *tech_pvt;
 		switch_channel_t *channel;
@@ -964,9 +975,8 @@
 
 	deactivate_audio_device();
 	deactivate_ring_device();
+	destroy_codecs();
 
-	switch_core_timer_destroy(&globals.timer);
-	switch_core_timer_destroy(&globals.hold_timer);
 	Pa_Terminate();
 	switch_core_hash_destroy(&globals.call_hash);
 
@@ -975,21 +985,25 @@
 	return SWITCH_STATUS_SUCCESS;
 }
 
+#if 0
 SWITCH_MODULE_RUNTIME_FUNCTION(mod_portaudio_runtime)
 {
 	globals.monitor_running = 1;
 	while(globals.monitor_running == 1) {
+		switch_mutex_lock(globals.pvt_lock);
 		if (!globals.call_list && globals.deactivate_timer > 0) {
 			if (!--globals.deactivate_timer) {
 				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "No more channels, deactivating audio\n");
 				deactivate_audio_device();
 			}
 		}
+		switch_mutex_unlock(globals.pvt_lock);
 		switch_yield(1000000);
 	}
 	globals.monitor_running = 0;
 	return SWITCH_STATUS_TERM;
 }
+#endif
 
 static int get_dev_by_number(char *numstr, int in)
 {
@@ -1345,6 +1359,14 @@
 		err = OpenAudioStream(&globals.audio_stream, &inputParameters, &outputParameters, sample_rate, paClipOff,
 							  globals.read_codec.implementation->samples_per_packet, globals.dual_streams);
 		/* UNLOCKED ************************************************************************************************* */
+
+		if (err != paNoError) {
+			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error opening audio device! retrying\n");
+			switch_yield(1000000);
+			err = OpenAudioStream(&globals.audio_stream, &inputParameters, &outputParameters, sample_rate, paClipOff,
+								  globals.read_codec.implementation->samples_per_packet, globals.dual_streams);
+		}
+
 		switch_mutex_unlock(globals.device_lock);
 		
 		if (err != paNoError) {

Modified: freeswitch/trunk/src/mod/endpoints/mod_portaudio/pablio.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_portaudio/pablio.c	(original)
+++ freeswitch/trunk/src/mod/endpoints/mod_portaudio/pablio.c	Wed Jan 21 21:14:08 2009
@@ -260,15 +260,9 @@
 
 	/* Allocate PABLIO_Stream structure for caller. */
 	aStream = (PABLIO_Stream *) malloc(sizeof(PABLIO_Stream));
-	if (aStream == NULL)
-		return paInsufficientMemory;
+	switch_assert(aStream);
 	memset(aStream, 0, sizeof(PABLIO_Stream));
 	
-	/* Initialize PortAudio  */
-	err = Pa_Initialize();
-	if (err != paNoError)
-		goto error;
-
 	if (inputParameters) {
 		channels = inputParameters->channelCount;
 	} else if (outputParameters) {
@@ -282,32 +276,24 @@
 
 	if (inputParameters) {
 		err = PABLIO_InitFIFO(&aStream->inFIFO, numFrames, aStream->bytesPerFrame);
-		if (err != paNoError)
+		if (err != paNoError) {
 			goto error;
-
+		}
 		aStream-> has_in = 1;
-
 	}
 
 	if (outputParameters) {
 		err = PABLIO_InitFIFO(&aStream->outFIFO, numFrames, aStream->bytesPerFrame);
-		if (err != paNoError)
+		if (err != paNoError) {
 			goto error;
-
+		}
 		aStream-> has_out = 1;
 	}
 
-	/* Make Write FIFO appear full initially. */
-	//numBytes = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFO);
-	//PaUtil_AdvanceRingBufferWriteIndex(&aStream->outFIFO, numBytes);
-
-
 	/* Open a PortAudio stream that we will use to communicate with the underlying
 	 * audio drivers. */
 
-	aStream->do_dual = do_dual;
-	
-
+	aStream->do_dual = do_dual;	
 
 	if (aStream->do_dual) {
 		err = Pa_OpenStream(&aStream->istream, inputParameters, NULL, sampleRate, samples_per_packet, streamFlags, iblockingIOCallback, aStream);
@@ -322,8 +308,9 @@
 		err = Pa_OpenStream(&aStream->iostream, inputParameters, outputParameters, sampleRate, samples_per_packet, streamFlags, ioblockingIOCallback, aStream);
 	}
 
-	if (err != paNoError)
+	if (err != paNoError) {
 		goto error;
+	}
 	
 	if (aStream->do_dual) {
 		err = Pa_StartStream(aStream->istream);
@@ -338,7 +325,6 @@
 			goto error;
 		}
 
-
 	} else {
 		err = Pa_StartStream(aStream->iostream);
 	}
@@ -348,13 +334,15 @@
 	}
 
 	*rwblPtr = aStream;
-	
-	switch_yield(500000);
 
+	switch_yield(500000);
+	
 	return paNoError;
 
   error:
+
 	CloseAudioStream(aStream);
+
 	*rwblPtr = NULL;
 	return err;
 }
@@ -363,14 +351,19 @@
 PaError CloseAudioStream(PABLIO_Stream * aStream)
 {
 	int bytesEmpty;
-	int byteSize = aStream->outFIFO.bufferSize;
+	int byteSize;
 
-	/* If we are writing data, make sure we play everything written. */
-	if (byteSize > 0) {
-		bytesEmpty = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFO);
-		while (bytesEmpty < byteSize) {
-			Pa_Sleep(10);
+	
+	byteSize = aStream->outFIFO.bufferSize;
+
+	if (aStream->has_out) {
+		/* If we are writing data, make sure we play everything written. */
+		if (byteSize > 0) {
 			bytesEmpty = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFO);
+			while (bytesEmpty < byteSize) {
+				Pa_Sleep(10);
+				bytesEmpty = PaUtil_GetRingBufferWriteAvailable(&aStream->outFIFO);
+			}
 		}
 	}
 
@@ -404,10 +397,15 @@
 		}
 	}
 
-	PABLIO_TermFIFO(&aStream->inFIFO);
-	PABLIO_TermFIFO(&aStream->outFIFO);
-	free(aStream);
+	if (aStream->has_in) {	
+		PABLIO_TermFIFO(&aStream->inFIFO);
+	}
+	
+	if (aStream->has_out) {
+		PABLIO_TermFIFO(&aStream->outFIFO);
+	}
 
+	free(aStream);
 	switch_yield(500000);
 
 	return paNoError;



More information about the Freeswitch-svn mailing list