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