|
@@ -12,8 +12,14 @@
|
|
|
#include "../../Other/libaudioqueue/libaudioqueue.h"
|
|
|
|
|
|
#include "../../Other/rvcmediacommon/rvc_media_common.h"
|
|
|
+#include <string.h>
|
|
|
|
|
|
+#ifdef _WIN32
|
|
|
#define AUDIO_CLOCK 8000
|
|
|
+#else
|
|
|
+#define AUDIO_CLOCK 44100
|
|
|
+#endif
|
|
|
+
|
|
|
#define AUDIO_SHM_FRAME_TIME 20 // 20ms
|
|
|
|
|
|
#ifndef RVC_MAX_BUFFER_LEN
|
|
@@ -55,7 +61,13 @@ struct audio_session_t
|
|
|
|
|
|
audiobridge_t *bridge;
|
|
|
apr_pool_t *micspk_pool;
|
|
|
- audiomicspk2_t *micspkstream;
|
|
|
+
|
|
|
+#ifdef _WIN32
|
|
|
+ audiomicspk2_t* micspkstream;
|
|
|
+#else
|
|
|
+ audiomicspklinux_t* micspkstream;
|
|
|
+#endif // _WIN32
|
|
|
+
|
|
|
audiodsp_t *dspstream;
|
|
|
audioresize_t *resizestream;
|
|
|
audiortp_t *rtpstream;
|
|
@@ -106,8 +118,9 @@ static int on_rx_audio(char *frame,void*userdata)
|
|
|
|
|
|
static void m_on_send_hook(const char *buf, int size, void *arg)
|
|
|
{
|
|
|
+ LOG_FUNCTION();
|
|
|
//Dbg("send audio pkt");
|
|
|
- if ((g_nAudioSendNum%60) ==0)
|
|
|
+ //if ((g_nAudioSendNum%60) ==0)
|
|
|
{
|
|
|
Dbg("send audio pkt num %d,single size %d",g_nAudioSendNum,size);
|
|
|
}
|
|
@@ -136,10 +149,12 @@ static bool phonemedia_rtp_record(audio_session_t* pseesion)
|
|
|
|
|
|
static void m_on_recv_hook(const char *buf, int size, void *arg)
|
|
|
{
|
|
|
+ LOG_FUNCTION();
|
|
|
rtp_hdr *hdr = (rtp_hdr*)buf;
|
|
|
audio_session_t* pseesion = (audio_session_t*)arg;
|
|
|
|
|
|
- if ((g_nAudioRecvNum%100) == 0){
|
|
|
+ //if ((g_nAudioRecvNum%100) == 0)
|
|
|
+ {
|
|
|
Dbg("recv audio pkt num %d,single size %d",g_nAudioRecvNum,size);
|
|
|
if (pseesion->phonemedia_conf.eDeviceType == eStand2sType){
|
|
|
Dbg("current hand free flag is %d, call type = %d, pt = %d,arg addr is %0x.",(int)pseesion->phonemedia_conf.dev_type, pseesion->phonemedia_conf.eCalltype, hdr->pt, arg);
|
|
@@ -335,6 +350,7 @@ on_error:
|
|
|
|
|
|
static int phonemedia_start(audio_session_t *session)
|
|
|
{
|
|
|
+ LOG_FUNCTION();
|
|
|
audio_session_t *media = session;
|
|
|
audio_session_phonemedia_conf_t *conf = &media->phonemedia_conf;
|
|
|
apr_status_t status;
|
|
@@ -351,7 +367,7 @@ static int phonemedia_start(audio_session_t *session)
|
|
|
|
|
|
in_dev = &session->conf.in_dev[conf->dev_type][0];
|
|
|
out_dev = &session->conf.out_dev[conf->dev_type][0];
|
|
|
- Dbg("in_dev = %s,out_dev =%s",in_dev,out_dev);
|
|
|
+ Dbg("in_dev = %s,out_dev =%s, audio dir = %d",in_dev,out_dev, conf->dir);
|
|
|
|
|
|
opt_micspk = AMS_OPT_AS_STREAM;
|
|
|
if (conf->dir & DIR_TX) {
|
|
@@ -375,15 +391,6 @@ static int phonemedia_start(audio_session_t *session)
|
|
|
if (conf->remote_ptime == 0)
|
|
|
conf->remote_ptime = 20;
|
|
|
break;
|
|
|
-#if 0
|
|
|
- case 4:
|
|
|
- codec = "G723";
|
|
|
- if (conf->local_ptime == 0)
|
|
|
- conf->local_ptime = 30;
|
|
|
- if (conf->remote_ptime == 0)
|
|
|
- conf->remote_ptime = 30;
|
|
|
- break;
|
|
|
-#endif
|
|
|
case 8:
|
|
|
codec = "PCMA";
|
|
|
if (conf->local_ptime == 0)
|
|
@@ -408,41 +415,45 @@ static int phonemedia_start(audio_session_t *session)
|
|
|
if (conf->local_ptime != conf->remote_ptime) {
|
|
|
conf->local_ptime = conf->remote_ptime;
|
|
|
}
|
|
|
-
|
|
|
status = apr_pool_create(&media->pool, NULL);
|
|
|
if (status != APR_SUCCESS) {
|
|
|
Dbg("create pool failed!");
|
|
|
return Error_Resource;
|
|
|
}
|
|
|
+ else {
|
|
|
+ Dbg("create pool success!");
|
|
|
+ }
|
|
|
|
|
|
status = audioengine_create(media->pool, &media->engine);
|
|
|
if (status != APR_SUCCESS) {
|
|
|
Dbg("create audio engine failed!");
|
|
|
goto on_error;
|
|
|
}
|
|
|
+ else {
|
|
|
+ Dbg("create audio engine success!");
|
|
|
+ }
|
|
|
|
|
|
status = audioengine_start(media->engine);
|
|
|
if (status != APR_SUCCESS) {
|
|
|
goto on_error;
|
|
|
}
|
|
|
- Dbg("audioengine_start success!");
|
|
|
|
|
|
- rc = rtp_session_create2(conf->local_rtp_ip, conf->local_rtp_port,
|
|
|
- 2, &media->rtpsess);
|
|
|
+ rc = rtp_session_create2(conf->local_rtp_ip, conf->local_rtp_port, 2, &media->rtpsess);
|
|
|
if (rc != 0) {
|
|
|
goto on_error;
|
|
|
}
|
|
|
- Dbg("rtp_session_create2 success!");
|
|
|
- //rc = rtp_session_reset2(media->rtpsess, conf->dir|RTP_SESSION_FLAG_NO_RTCP, conf->remote_rtp_ip, conf->remote_rtp_port, conf->remote_rtp_port+1);
|
|
|
- rc = rtp_session_reset2(media->rtpsess, conf->dir, conf->remote_rtp_ip, conf->remote_rtp_port, conf->remote_rtp_port+1);
|
|
|
+
|
|
|
+ rc = rtp_session_reset2(media->rtpsess, conf->dir, conf->remote_rtp_ip, conf->remote_rtp_port, conf->remote_rtp_port + 1);
|
|
|
if (rc != 0) {
|
|
|
goto on_error;
|
|
|
}
|
|
|
- Dbg("rtp_session_create2 success!");
|
|
|
+ Dbg("rtp_session_reset2 success! rc = %d", rc);
|
|
|
|
|
|
status = audiobridge_create(media->pool, media->engine, &media->bridge);
|
|
|
if (status != APR_SUCCESS)
|
|
|
goto on_error;
|
|
|
+ Dbg("audiobridge_create success!");
|
|
|
+
|
|
|
status = apr_pool_create(&media->micspk_pool, media->pool);
|
|
|
if (status != APR_SUCCESS)
|
|
|
goto on_error;
|
|
@@ -452,15 +463,21 @@ static int phonemedia_start(audio_session_t *session)
|
|
|
opt_micspk |= AMS2_OPT_NS;
|
|
|
if (aec)
|
|
|
opt_micspk |= AMS2_OPT_AEC;
|
|
|
+#ifdef _WIN32
|
|
|
//create Spk
|
|
|
status = audiomicspk2_create(media->micspk_pool, media->engine, opt_micspk, AUDIO_CLOCK, in_dev, out_dev, &media->micspkstream);
|
|
|
+#else
|
|
|
+ status = audiomicspklinux_create(media->micspk_pool, media->engine, opt_micspk, AUDIO_CLOCK, in_dev, out_dev, &media->micspkstream);
|
|
|
+#endif
|
|
|
+ if (status != APR_SUCCESS)
|
|
|
+ goto on_error;
|
|
|
+
|
|
|
//ÒôƵ»Øµ÷
|
|
|
+ Dbg("audiomicspk_create success!");
|
|
|
media->micspkstream->user_data = media;
|
|
|
media->micspkstream->on_rx_audio = &on_rx_audio;
|
|
|
Dbg("init on_rx_audio success!");
|
|
|
- //status = audiomicspk3_create(media->micspk_pool, media->engine, opt_micspk, AUDIO_CLOCK, in_dev, out_dev, &media->micspkstream);
|
|
|
- if (status != APR_SUCCESS)
|
|
|
- goto on_error;
|
|
|
+
|
|
|
if (out_agc || out_ns) {
|
|
|
int read_opt = AUDIO_DSP_NONE;
|
|
|
int write_opt = AUDIO_DSP_NONE;
|
|
@@ -468,31 +485,40 @@ static int phonemedia_start(audio_session_t *session)
|
|
|
write_opt |= AUDIO_DSP_AGC;
|
|
|
if (out_ns)
|
|
|
write_opt |= AUDIO_DSP_DENOISE;
|
|
|
- //Dbg("audiomicspk2_create success!");
|
|
|
+
|
|
|
status = audiodsp_create(media->micspk_pool, media->engine, read_opt, write_opt, AUDIO_CLOCK, &media->dspstream);
|
|
|
if (status != APR_SUCCESS)
|
|
|
goto on_error;
|
|
|
- //Dbg("audiodsp_create success!");
|
|
|
+
|
|
|
+ Dbg("audiodsp_create success!");
|
|
|
}
|
|
|
+
|
|
|
#if 0
|
|
|
status = audioaec_create(media->pool, media->engine, AUDIO_CLOCK, FRAME_TIME,
|
|
|
AUDIO_AEC_OPT_READ_AS_CAPTURE, &media->aecstream);
|
|
|
if (status != APR_SUCCESS)
|
|
|
goto on_error;
|
|
|
#endif
|
|
|
+
|
|
|
status = audioresize_create(media->pool, media->engine, FRAME_TIME*2*AUDIO_CLOCK/1000,
|
|
|
conf->remote_ptime*2*AUDIO_CLOCK/1000, FRAME_TIME*2*AUDIO_CLOCK/1000,
|
|
|
conf->local_ptime*2*AUDIO_CLOCK/1000, &media->resizestream);
|
|
|
if (status != APR_SUCCESS)
|
|
|
goto on_error;
|
|
|
+
|
|
|
+ Dbg("audioresize_create success!");
|
|
|
+
|
|
|
status = audiocodec_create(media->pool, media->engine, codec, AUDIO_CLOCK, FRAME_TIME,
|
|
|
AUDIO_CODEC_OPT_ENCODE_WRITE, &media->codecstream);
|
|
|
if (status != APR_SUCCESS)
|
|
|
goto on_error;
|
|
|
+
|
|
|
+ Dbg("audiocodec_create success!");
|
|
|
+
|
|
|
status = audiortp_create(media->pool, media->engine, media->rtpsess, &media->rtpstream);
|
|
|
if (status != APR_SUCCESS)
|
|
|
goto on_error;
|
|
|
- Dbg("audio_session_t session addr is %0x, audiortp_create success,and media->rtpstream addrs is %0x!",session, media->rtpstream);
|
|
|
+ Dbg("audio_session_t session addr is 0x%0x, audiortp_create success,and media->rtpstream addrs is 0x%0x!",session, media->rtpstream);
|
|
|
|
|
|
g_nAudioRecvNum = 0;
|
|
|
g_nAudioSendNum = 0;
|
|
@@ -517,10 +543,8 @@ static int phonemedia_start(audio_session_t *session)
|
|
|
//Dbg("recv hook addr %d,send hook addr %d", &m_on_recv_hook,&m_on_send_hook);
|
|
|
audiortp_set_param(media->rtpstream, AUDIO_RTP_FLAG_HOOK_ARG, media);
|
|
|
Dbg("AUDIO_RTP_FLAG_HOOK_ARG addr is %0x.", media);
|
|
|
-
|
|
|
- //audiortp_set_param(media->rtpstream, AUDIO_RTP_FLAG_RECV_HOOK, &m_on_recv_hook);
|
|
|
- //audiortp_set_param(media->rtpstream, AUDIO_RTP_FLAG_SEND_HOOK, &m_on_send_hook);
|
|
|
-
|
|
|
+ audiortp_set_param(media->rtpstream, AUDIO_RTP_FLAG_RECV_HOOK, (const void*)&m_on_recv_hook);
|
|
|
+ audiortp_set_param(media->rtpstream, AUDIO_RTP_FLAG_SEND_HOOK, (const void *)&m_on_send_hook);
|
|
|
//audiortp_set_param(media->rtpstream, AUDIO_RTP_FLAG_HOOK_ARG, media->rtpstream);
|
|
|
audiortp_init(media->rtpstream);
|
|
|
}
|
|
@@ -571,6 +595,7 @@ static int phonemedia_start(audio_session_t *session)
|
|
|
status = audiocontext_create(media->pool, media->engine, &media->context);
|
|
|
if (status != APR_SUCCESS)
|
|
|
goto on_error;
|
|
|
+
|
|
|
Dbg("audiocontext_create success!");
|
|
|
|
|
|
audiocontext_add_driver(media->context, &media->bridge->base);
|
|
@@ -588,7 +613,7 @@ static int phonemedia_start(audio_session_t *session)
|
|
|
|
|
|
on_error:
|
|
|
phonemedia_stop(media, TRUE);
|
|
|
- Dbg("phonemedia_stop error!!!");
|
|
|
+ Dbg("phonemedia_start error!!!");
|
|
|
return Error_Resource;
|
|
|
}
|
|
|
|
|
@@ -598,8 +623,8 @@ static int phonemedia_stop(audio_session_t *session, int b_record_turn_off)
|
|
|
if (media->context) {
|
|
|
audioengine_stop_context(media->engine, media->context);
|
|
|
audiocontext_remove_driver(media->context, &media->bridge->base);
|
|
|
- audiocontext_destroy(media->context);
|
|
|
- media->context = NULL;
|
|
|
+ //audiocontext_destroy(media->context);
|
|
|
+ //media->context = NULL;
|
|
|
}
|
|
|
if (media->engine) {
|
|
|
audioengine_stop(media->engine);
|
|
@@ -635,7 +660,11 @@ static int phonemedia_stop(audio_session_t *session, int b_record_turn_off)
|
|
|
media->dspstream = NULL;
|
|
|
}
|
|
|
if (media->micspkstream) {
|
|
|
+#ifdef _WIN32
|
|
|
audiomicspk2_destroy(media->micspkstream);
|
|
|
+#else
|
|
|
+ audiomicspklinux_destroy(media->micspkstream);
|
|
|
+#endif
|
|
|
media->micspkstream = NULL;
|
|
|
apr_pool_destroy(media->micspk_pool);
|
|
|
media->micspk_pool = NULL;
|
|
@@ -701,9 +730,13 @@ static int phonemedia_chang_dev(audio_session_t *session, e_dev_type t)
|
|
|
//apr_status_t status;
|
|
|
audiocontext_remove_driver(media->context, &media->bridge->base);
|
|
|
if (media->micspkstream) {
|
|
|
- Dbg("start audiomicspk2_destroy");
|
|
|
+ Dbg("start audiomicspk_destroy");
|
|
|
+#ifdef _WIN32
|
|
|
audiomicspk2_destroy(media->micspkstream);
|
|
|
- Dbg("start audiomicspk2_destroy success");
|
|
|
+#else
|
|
|
+ audiomicspklinux_destroy(media->micspkstream);
|
|
|
+#endif
|
|
|
+ Dbg("start audiomicspk_destroy success");
|
|
|
media->micspkstream = NULL;
|
|
|
}
|
|
|
if (media->dspstream) {
|
|
@@ -719,8 +752,12 @@ static int phonemedia_chang_dev(audio_session_t *session, e_dev_type t)
|
|
|
if (aec)
|
|
|
opt_micspk |= AMS2_OPT_AEC;
|
|
|
Dbg("start audiomicspk2_create");
|
|
|
+#ifdef _WIN32
|
|
|
audiomicspk2_create(media->micspk_pool, media->engine, opt_micspk, AUDIO_CLOCK, in_dev, out_dev, &media->micspkstream);
|
|
|
- Dbg("start audiomicspk2_create success");
|
|
|
+#else
|
|
|
+ audiomicspklinux_create(media->micspk_pool, media->engine, opt_micspk, AUDIO_CLOCK, in_dev, out_dev, &media->micspkstream);
|
|
|
+#endif
|
|
|
+ Dbg("start audiomicspk_create success");
|
|
|
media->micspkstream->on_rx_audio = &on_rx_audio;
|
|
|
media->phonemedia_conf.dev_type = t;
|
|
|
Dbg("init change dev on_rx_audio success!");
|
|
@@ -813,6 +850,7 @@ int audio_session_create(const audio_session_conf_t *conf, audio_session_t **p_s
|
|
|
int audio_session_start_phonemedia(audio_session_t *session, const audio_session_phonemedia_conf_t *conf)
|
|
|
{
|
|
|
int rc;
|
|
|
+ LOG_FUNCTION();
|
|
|
if (!session)
|
|
|
return Error_NotInit;
|
|
|
if (session->pool) { // already started
|
|
@@ -855,9 +893,10 @@ static void __stdcall __audio_log_func(int level, const char *s)
|
|
|
|
|
|
int audio_lib_init()
|
|
|
{
|
|
|
-#ifdef RVC_OS_WIN
|
|
|
+ LOG_FUNCTION();
|
|
|
audio_log_set_func(&__audio_log_func);
|
|
|
int rc = audioframework_init();
|
|
|
+
|
|
|
if (rc != 0) {
|
|
|
return Error_Resource;
|
|
|
}
|
|
@@ -881,38 +920,13 @@ int audio_lib_init()
|
|
|
audio_log_set_func(&__audio_log_func);
|
|
|
}
|
|
|
|
|
|
-#else
|
|
|
- Pa_Initialize();
|
|
|
- //PaUtil_SetDebugPrintFunction(&__PaUtilLogCallback);
|
|
|
-
|
|
|
- int icnt, ocnt;
|
|
|
- int rc = audio_get_dev_count(&icnt, &ocnt);
|
|
|
- if (rc == 0) {
|
|
|
- int i;
|
|
|
- Dbg("audio input devices(%d):", icnt);
|
|
|
- for (i = 0; i < icnt; ++i) {
|
|
|
- CSimpleStringA str = audio_get_dev_name(true, i);
|
|
|
- Dbg("%d = %s", i, (LPCSTR)str);
|
|
|
- }
|
|
|
- Dbg("audio output devices(%d):", ocnt);
|
|
|
- for (i = 0; i < ocnt; ++i) {
|
|
|
- CSimpleStringA str = audio_get_dev_name(false, i);
|
|
|
- Dbg("%d = %s", i, (LPCSTR)str);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-#endif // RVC_OS_WIN
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
void audio_lib_deinit()
|
|
|
{
|
|
|
-#ifdef RVC_OS_WIN
|
|
|
+ LOG_FUNCTION();
|
|
|
audioframework_term();
|
|
|
-#else
|
|
|
-
|
|
|
-#endif // RVC_OS_WIN
|
|
|
}
|
|
|
|
|
|
int audio_get_dev_count(int *in_cnt, int *out_cnt)
|
|
@@ -987,6 +1001,7 @@ int capture_get_audio_device_id(bool in_direction, const char *dev_name)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
int get_audio_dev_name(char*devname,char*in_dev,char*out_dev)
|
|
|
{
|
|
|
int icnt, ocnt;
|