Jelajahi Sumber

Z991239-5614 #comment 优化远程双录时提挂机操作坐席端音频录制流程

80274480 1 tahun lalu
induk
melakukan
a27373c18a

+ 129 - 129
Module/mod_sipphone/audio_session.cpp

@@ -26,10 +26,6 @@
 #define RVC_MAX_BUFFER_LEN 512
 #endif
 
-#ifndef RVC_AUDIO_BUFFER_SIZE
-#define RVC_AUDIO_BUFFER_SIZE 1024
-#endif
-
 #ifndef RVC_AUDIO_FRAME_LEN
 #define RVC_AUDIO_FRAME_LEN	320
 #endif
@@ -82,36 +78,36 @@ struct audio_session_t
 	rtp_session_t *rtpsess;
 	Clibaudioqueue*remoteaudioqueue;
 	bool baudiorecved;
-	bool brtpinsertqueue;
+	//bool brtpinsertqueue;
+	int iaudio_seriesnumber;
 #ifdef RVC_OS_LINUX
 	//audio noise suppression
 	IAudioNs* audionsobj;
 	IAudioNs* audioplaynsobj;
 	//FILE* pFile;
-	int iaudio_seriesnumber;
 #endif
 };
 
 #ifdef RVC_OS_WIN
-static bool phonemedia_rtp_record(audio_session_t* pseesion)
-{
-	bool bret = false;
-	if (NULL == pseesion){
-		return bret;
-	}
-
-	if (true == pseesion->brtpinsertqueue){
-		if (DOUBLERECORD_CALLTYPE == pseesion->phonemedia_conf.eCalltype){
-			if (eStand2sType == pseesion->phonemedia_conf.eDeviceType){
-				if (DEV_PICKUP == pseesion->phonemedia_conf.dev_type){
-					bret = true;
-				}
-			}
-		}
-	}
-
-	return bret;
-}
+//static bool phonemedia_rtp_record(audio_session_t* pseesion)
+//{
+//	bool bret = false;
+//	if (NULL == pseesion){
+//		return bret;
+//	}
+//
+//	if (true == pseesion->brtpinsertqueue){
+//		if (DOUBLERECORD_CALLTYPE == pseesion->phonemedia_conf.eCalltype){
+//			if (eStand2sType == pseesion->phonemedia_conf.eDeviceType){
+//				if (DEV_PICKUP == pseesion->phonemedia_conf.dev_type){
+//					bret = true;
+//				}
+//			}
+//		}
+//	}
+//
+//	return bret;
+//}
 #else
 static int tx_audio_callback(void* audiodata, void* userdata)
 {
@@ -152,6 +148,9 @@ static int rvc_audio_play_ns(void* pdst, size_t udstlen, void* psrc, size_t usrc
 	return iret;
 }
 
+#endif
+
+
 static int rvc_audio_playing_data(void* pdata, size_t ulen, void* user_data)
 {
 	int iret = -1;
@@ -191,38 +190,38 @@ static int rvc_audio_playing_data(void* pdata, size_t ulen, void* user_data)
 	return iret;
 }
 
-#endif
 
-static int rx_audio_callback(char *frame,void*userdata)
-{
-	audio_session_t*session = (audio_session_t*)userdata;
-	int used = 0;
 
-	if (DOUBLERECORD_CALLTYPE != session->phonemedia_conf.eCalltype)
-	{
-		if (frame) 
-		{
-			audio_frame frm;
-			frm.bitspersample = 16;
-			frm.format = 1;
-			frm.data = frame;
-			frm.framesize = 160;   //注意此参数可能不准确,网络传输的包大小可能是不定长的,取音频数据时慎用此参数
-			//写入实际的单个包大小
-			//frm.framesize = strlen(frame);  //不能使用此方法,网络传输的包大小可能是不定长的
-			frm.nchannels = 1;
-			frm.samplespersec = 8000;
-		#ifdef RVC_OS_LINUX
-			frm.iseriesnumber = g_nAudioRecvNum;
-		#endif
-			if (!session->remoteaudioqueue->InsertAudio(&frm)) 
-			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InsertAudio failed! frameCount:%d", frm.framesize);
-				used = -1;
-			}
-		}
-	}
-	return used;
-}
+//static int rx_audio_callback(char *frame,void*userdata)
+//{
+//	audio_session_t*session = (audio_session_t*)userdata;
+//	int used = 0;
+//
+//	if (DOUBLERECORD_CALLTYPE != session->phonemedia_conf.eCalltype)
+//	{
+//		if (frame) 
+//		{
+//			audio_frame frm;
+//			frm.bitspersample = 16;
+//			frm.format = 1;
+//			frm.data = frame;
+//			frm.framesize = 160;   //注意此参数可能不准确,网络传输的包大小可能是不定长的,取音频数据时慎用此参数
+//			//写入实际的单个包大小
+//			//frm.framesize = strlen(frame);  //不能使用此方法,网络传输的包大小可能是不定长的
+//			frm.nchannels = 1;
+//			frm.samplespersec = 8000;
+//		#ifdef RVC_OS_LINUX
+//			frm.iseriesnumber = g_nAudioRecvNum;
+//		#endif
+//			if (!session->remoteaudioqueue->InsertAudio(&frm)) 
+//			{
+//				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InsertAudio failed! frameCount:%d", frm.framesize);
+//				used = -1;
+//			}
+//		}
+//	}
+//	return used;
+//}
 
 static void send_hook_callback(const char *buf, int size, void *arg)
 {
@@ -239,64 +238,64 @@ static void recv_hook_callback(const char *buf, int size, void *arg)
 		psession->baudiorecved = true;
 	}
 	
-#ifdef RVC_OS_WIN
-	if (0 == psession->phonemedia_conf.dev_type && DOUBLERECORD_CALLTYPE == psession->phonemedia_conf.eCalltype){
-		if (false == psession->brtpinsertqueue){
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("rtp stream insert to audio queue flag is set to true.");
-		}
-		psession->brtpinsertqueue = true;
-	}
-	g_nAudioRecvNum++;
-
-	if (true == phonemedia_rtp_record(psession)){
-		char strbuffer[RVC_AUDIO_BUFFER_SIZE]={0};
-		int outsize = RVC_AUDIO_BUFFER_SIZE;
-		switch(hdr->pt)
-		{
-		case RTP_PT_PCMA:
-			audiocodec_pcma_decode(buf+sizeof(rtp_hdr), size-sizeof(rtp_hdr), strbuffer, &outsize);
-			break;
-		case RTP_PT_PCMU:
-			audiocodec_pcmu_decode(buf+sizeof(rtp_hdr), size-sizeof(rtp_hdr), strbuffer, &outsize);
-			break;
-		case RTP_PT_G729:
-			audiocodec_g729a_decode(buf+sizeof(rtp_hdr), size-sizeof(rtp_hdr), strbuffer, &outsize);
-			break;
-		default:
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("audiocodec_decode not support audio pt(%d).", hdr->pt);
-			break;
-		}
-
-		if (psession && psession->remoteaudioqueue){
-			int iCount = (outsize+iLastLeft)/RVC_AUDIO_FRAME_LEN;
-			memcpy(straudiodata+iLastLeft, strbuffer, iCount*RVC_AUDIO_FRAME_LEN-iLastLeft);
-			for(int i = 0; i < iCount; i++)
-			{
-				audio_frame frm;
-				char straudio[RVC_AUDIO_FRAME_LEN]={0};
-				memcpy(straudio, straudiodata+i*RVC_AUDIO_FRAME_LEN, RVC_AUDIO_FRAME_LEN);
-				frm.bitspersample = 16;
-				frm.format = 1;
-				frm.data = straudio;
-				frm.framesize = RVC_AUDIO_FRAME_LEN;   //注意此参数可能不准确,网络传输的包大小可能是不定长的,取音频数据时慎用此参数
-				frm.nchannels = 1;
-				frm.samplespersec = 8000;
-				if (!psession->remoteaudioqueue->InsertAudio(&frm)) 
-				{
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InsertAudio failed! frameCount:%d", frm.framesize);
-				}
-			}
-			memset(straudiodata, 0, RVC_AUDIO_BUFFER_SIZE);									//清空缓存
-			iLastLeft = (outsize + iLastLeft) % RVC_AUDIO_FRAME_LEN;						//上次剩余不足RVC_AUDIO_FRAME_LEN的buffer
-			if ((0 != iLastLeft) && (iCount*RVC_AUDIO_FRAME_LEN < outsize)){
-				memcpy(straudiodata, strbuffer+iCount*RVC_AUDIO_FRAME_LEN, iLastLeft);		//暂存上一次的未入队列的音频数据
-			}
-		}
-		else{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pseesion->remoteaudioqueue is null.");
-		}
-	}
-#endif
+//#ifdef RVC_OS_WIN
+//	if (0 == psession->phonemedia_conf.dev_type && DOUBLERECORD_CALLTYPE == psession->phonemedia_conf.eCalltype){
+//		if (false == psession->brtpinsertqueue){
+//			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("rtp stream insert to audio queue flag is set to true.");
+//		}
+//		psession->brtpinsertqueue = true;
+//	}
+//	g_nAudioRecvNum++;
+//
+//	if (true == phonemedia_rtp_record(psession)){
+//		char strbuffer[RVC_MAX_BUFFER_LEN]={0};
+//		int outsize = RVC_MAX_BUFFER_LEN;
+//		switch(hdr->pt)
+//		{
+//		case RTP_PT_PCMA:
+//			audiocodec_pcma_decode(buf+sizeof(rtp_hdr), size-sizeof(rtp_hdr), strbuffer, &outsize);
+//			break;
+//		case RTP_PT_PCMU:
+//			audiocodec_pcmu_decode(buf+sizeof(rtp_hdr), size-sizeof(rtp_hdr), strbuffer, &outsize);
+//			break;
+//		case RTP_PT_G729:
+//			audiocodec_g729a_decode(buf+sizeof(rtp_hdr), size-sizeof(rtp_hdr), strbuffer, &outsize);
+//			break;
+//		default:
+//			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("audiocodec_decode not support audio pt(%d).", hdr->pt);
+//			break;
+//		}
+//
+//		if (psession && psession->remoteaudioqueue){
+//			int iCount = (outsize+iLastLeft)/RVC_AUDIO_FRAME_LEN;
+//			memcpy(straudiodata+iLastLeft, strbuffer, iCount*RVC_AUDIO_FRAME_LEN-iLastLeft);
+//			for(int i = 0; i < iCount; i++)
+//			{
+//				audio_frame frm;
+//				char straudio[RVC_AUDIO_FRAME_LEN]={0};
+//				memcpy(straudio, straudiodata+i*RVC_AUDIO_FRAME_LEN, RVC_AUDIO_FRAME_LEN);
+//				frm.bitspersample = 16;
+//				frm.format = 1;
+//				frm.data = straudio;
+//				frm.framesize = RVC_AUDIO_FRAME_LEN;   //注意此参数可能不准确,网络传输的包大小可能是不定长的,取音频数据时慎用此参数
+//				frm.nchannels = 1;
+//				frm.samplespersec = 8000;
+//				if (!psession->remoteaudioqueue->InsertAudio(&frm)) 
+//				{
+//					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InsertAudio failed! frameCount:%d", frm.framesize);
+//				}
+//			}
+//			memset(straudiodata, 0, RVC_MAX_BUFFER_LEN);									//清空缓存
+//			iLastLeft = (outsize + iLastLeft) % RVC_AUDIO_FRAME_LEN;						//上次剩余不足RVC_AUDIO_FRAME_LEN的buffer
+//			if ((0 != iLastLeft) && (iCount*RVC_AUDIO_FRAME_LEN < outsize)){
+//				memcpy(straudiodata, strbuffer+iCount*RVC_AUDIO_FRAME_LEN, iLastLeft);		//暂存上一次的未入队列的音频数据
+//			}
+//		}
+//		else{
+//			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("pseesion->remoteaudioqueue is null.");
+//		}
+//	}
+//#endif
 }
 
 
@@ -372,7 +371,7 @@ static void audio_device_event(bool bopen, int iret, bool bmicro, int idev, cons
 	LogWarn(Severity_Low, Error_Debug, errorcode, strinfo);
 }
 
-static int phonemedia_stop(audio_session_t *session, int b_record_turn_off);
+static int phonemedia_stop(audio_session_t *session);
 
 static void phonemedia_reconfig(audio_session_t *media, const audio_session_phonemedia_conf_t *conf)
 {
@@ -507,15 +506,14 @@ status = audiomicspk2_create(media->micspk_pool, media->engine, opt_micspk, AUDI
 	}
 	//音频回调
 	media->micspkstream->user_data = media;
-	media->micspkstream->on_rx_audio = &rx_audio_callback;
+	media->micspkstream->on_audio_playing = &rvc_audio_playing_data;
+
 #ifdef RVC_OS_LINUX
 	media->micspkstream->on_tx_audio = &tx_audio_callback;
 	media->micspkstream->on_audio_ns = &rvc_audio_ns;
 	media->micspkstream->on_audio_play_ns = &rvc_audio_play_ns;
-	media->micspkstream->on_audio_playing = &rvc_audio_playing_data;
 #endif
 
-
 	if (out_agc || out_ns) {
 		int read_opt = AUDIO_DSP_NONE;
 		int write_opt = AUDIO_DSP_NONE;
@@ -642,12 +640,12 @@ status = audiomicspk2_create(media->micspk_pool, media->engine, opt_micspk, AUDI
 	return 0;
 
 on_error:
-	phonemedia_stop(media, TRUE);
+	phonemedia_stop(media);
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("phonemedia_stop error!!!");
 	return Error_Resource;
 }
 
-static int phonemedia_stop(audio_session_t *session, int b_record_turn_off)
+static int phonemedia_stop(audio_session_t *session)
 {
 	audio_session_t *media = session;
 	if (media->context) {
@@ -768,16 +766,13 @@ static int phonemedia_chang_dev(audio_session_t *session, e_dev_type t)
 		audiomicspk2_create(media->micspk_pool, media->engine, opt_micspk, AUDIO_CLOCK, in_dev, out_dev, t, &audio_device_event, &media->micspkstream);
 #else
 		audiomicspkpulse_create(media->micspk_pool, media->engine, opt_micspk, AUDIO_CLOCK, in_dev, out_dev, t, &audio_device_event, &media->micspkstream);
-#endif
-		
-		media->micspkstream->on_rx_audio = &rx_audio_callback;
-#ifdef RVC_OS_LINUX
 		media->micspkstream->on_tx_audio = &tx_audio_callback;
 		media->micspkstream->on_audio_ns = &rvc_audio_ns;
 		media->micspkstream->on_audio_play_ns = &rvc_audio_play_ns;
+		
+#endif
 		media->micspkstream->on_audio_playing = &rvc_audio_playing_data;
 		media->micspkstream->user_data = media;
-#endif
 		media->phonemedia_conf.dev_type = t;
 
 		if (out_agc || out_ns) {
@@ -830,6 +825,8 @@ static int phonemedia_chang_dev(audio_session_t *session, e_dev_type t)
 	return Error_Unexpect;
 }
 
+#ifdef RVC_OS_WIN
+#else
 static void __audionslog(void* user_data, const char* fmt, va_list arg)
 {
 	int n = vsnprintf(NULL, 0, fmt, arg);
@@ -862,13 +859,16 @@ int audio_get_pcmrecord_filename(char* pbuffer, size_t ulen)
 
 	return iret;
 }
+#endif
 
 int audio_session_create(const audio_session_conf_t *conf, audio_session_t **p_session)
 {
 	audio_session_t *session = ZALLOC_T(audio_session_t);
 	session->remoteaudioqueue = new Clibaudioqueue(REC_COMMON_REMOTEAUDIO_SHM_QUEUE);
 	session->baudiorecved = false;
-	session->brtpinsertqueue = false;
+	//session->brtpinsertqueue = false;
+
+	session->iaudio_seriesnumber = RVC_MIN_AUDIO_SERIESNUMBER;
 
 #ifdef RVC_OS_WIN
 #else
@@ -882,7 +882,6 @@ int audio_session_create(const audio_session_conf_t *conf, audio_session_t **p_s
 	if (NULL != session->audioplaynsobj) {
 		session->audioplaynsobj->SetNsParams(8000, 10, 2);
 	}
-	session->iaudio_seriesnumber = RVC_MIN_AUDIO_SERIESNUMBER;
 	//char strfile[MAX_PATH] = { 0 };
 	//if (-1 != audio_get_pcmrecord_filename(strfile, MAX_PATH)) {
 	//	session->pFile = fopen(strfile, "wb+");
@@ -904,7 +903,7 @@ int audio_session_start_phonemedia(audio_session_t *session, const audio_session
 	if (!session)
 		return Error_NotInit;
 	if (session->pool) { // already started
-		phonemedia_stop(session, FALSE);
+		phonemedia_stop(session);
 	}
 	phonemedia_reconfig(session, conf);
 	rc = phonemedia_start(session);
@@ -918,7 +917,7 @@ int audio_session_change_dev(audio_session_t *session, e_dev_type t)
 
 int audio_session_stop(audio_session_t *session)
 {
-	return phonemedia_stop(session, TRUE);
+	return phonemedia_stop(session);
 }
 
 void audio_session_destroy(audio_session_t *session)
@@ -961,7 +960,8 @@ int audio_lib_init()
 	int rc = audioframework_init();
 	if (rc != 0) {
 		return Error_Resource;
-	} else {
+	} 
+	else {
 #ifdef RVC_OS_WIN
 		int icnt, ocnt;
 		audio_log_set_func(NULL);

+ 23 - 19
Other/win/libaudioframework/audiomicspk2.c

@@ -348,18 +348,18 @@ static HRESULT STDMETHODCALLTYPE GetBufferAndLength(IMediaBuffer * This, BYTE **
 }
 
 
-static int load_data(audiomicspk2_t *micspk, BYTE *pData, UINT32 nCount, UINT32 *pReturnedCount)
-{
-	UINT32 frame_samples = AUDIO_CLOCK * FRAME_TIME / 1000;
-	UINT32 frame_offset = 0;
-	while (nCount >= frame_samples) {
-		delay_buf_get((delay_buf*)micspk->ply_dbuf, (SHORT*)(pData+frame_offset*2));
-		frame_offset += frame_samples;
-		nCount -= frame_samples;
-	}
-	*pReturnedCount = frame_offset;
-	return 0;
-}
+//static int load_data(audiomicspk2_t *micspk, BYTE *pData, UINT32 nCount, UINT32 *pReturnedCount)
+//{
+//	UINT32 frame_samples = AUDIO_CLOCK * FRAME_TIME / 1000;
+//	UINT32 frame_offset = 0;
+//	while (nCount >= frame_samples) {
+//		delay_buf_get((delay_buf*)micspk->ply_dbuf, (SHORT*)(pData+frame_offset*2));
+//		frame_offset += frame_samples;
+//		nCount -= frame_samples;
+//	}
+//	*pReturnedCount = frame_offset;
+//	return 0;
+//}
 
 
 static int save_data(audiomicspk2_t *micspk, IMediaBuffer *pBuffer)
@@ -402,11 +402,15 @@ static int StreamCallback(const void *input,
 			SHORT data[160];
 			spx_uint32_t in_len = micspk->frame_samples;
 			spx_uint32_t out_len = micspk->capture_frame_samples;
-			delay_buf_get((delay_buf*)micspk->ply_dbuf, data);
-			//if (micspk->user_data/*&&strlen(data)*/)
-			//{
-			//	micspk->on_rx_audio((char*)data,micspk->user_data);
-			//}	
+			int iget = delay_buf_get((delay_buf*)micspk->ply_dbuf, data);
+			if (0 == iget) {
+				if (NULL != audio_micspk->on_audio_playing) {
+					audio_micspk->on_audio_playing((void*)delaybuffer, RVC_DELAY_AUDIO_LEN, audio_micspk->user_data);
+				}
+				else {
+					audio_log_v(AUDIO_LOG_LEVEL_INFO, "%s:%d on_audio_playing is NULL.", __FUNCTION__, __LINE__);
+				}
+			}
 			speex_resampler_process_int((SpeexResamplerState*)micspk->output_resample_state, 0, 
 				data, &in_len, (spx_int16_t*)output, &out_len);
 		}
@@ -424,7 +428,7 @@ static apr_status_t initialize_spk(audiomicspk2_t *micspk)
 	PaError paError;
 	int ply_dev_id = micspk->ply_dev_id_portaudio;
 
-	micspk->bstopout = FALSE;
+	micspk->bstopout = false;
 
 	if (ply_dev_id == -1) {
 		ply_dev_id = Pa_GetDefaultOutputDevice();
@@ -774,7 +778,7 @@ static void uninitialize_spk(audiomicspk2_t *micspk)
 {
 	if (micspk->ply_stream) {
 		PaError err = paNoError;
-		micspk->bstopout = TRUE;
+		micspk->bstopout = true;
 
 	
 		//micspk->on_audio_device_event(0, 0, 0, micspk->dev_type, "uninitialize_spk before Pa_StopStream", micspk);

+ 2 - 2
Other/win/libaudioframework/audiomicspk2.h

@@ -49,12 +49,12 @@ struct audiomicspk2_t
 	void *input_resample_state;
 	void *output_resample_state;
 	int dev_type;
-	BOOL bstopout;
+	bool bstopout;
 
 	HANDLE worker_thread;
-	int (*on_rx_audio)(char *frame,void*user_data);
 	//int (*on_audiodevice_failed)(int ideviceid,void*user_data);
 	//int (*on_audiodevice_callback)(int idevicetype, int ierror, char* strdeviceinfo, void* data);
+	int (*on_audio_playing)(void* pdata, size_t ulen, void* user_data);
 	void (*on_audio_device_event)(bool bopen, int iret, bool bmicro, int idev, const char* strmessage, void* user_data);
 	void*user_data;
 };