浏览代码

Z991239-3726 #comment 增加从播放流写入音频流流程

80274480 3 年之前
父节点
当前提交
dc5a4615c1

+ 1 - 1
Module/mod_localmediaplay/CMakeLists.txt

@@ -33,7 +33,7 @@ target_link_directories(${MODULE_NAME} PRIVATE
 if(WIN32)
 set(${MODULE_PREFIX}_LIBS  ${MODULE_BASE_LIBS} ${RVCCOMM_LIB} ShLwApi Shell32 imgplayer wmpplayer)
 else(WIN32)
-set(${MODULE_PREFIX}_LIBS  ${MODULE_BASE_LIBS} ${RVCCOMM_LIB} mediaplayer pictureplayer)
+set(${MODULE_PREFIX}_LIBS  ${MODULE_BASE_LIBS} ${RVCCOMM_LIB} audioqueue mediaplayer pictureplayer)
 endif(WIN32)
 
 target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS})

+ 54 - 5
Module/mod_localmediaplay/mod_localmediaplay.cpp

@@ -3,7 +3,7 @@
 #include "LocalMediaPlay_msg_g.h"
 #include "fileutil.h"
 #include "y2k_time.h"
-
+#include "../../Other/rvcmediacommon/rvc_media_common.h"
 
 #define DEFAULT_SLEEP_TIME		(60 * 1000)
 #define DEFAULT_ADVERT_TYPE		'A'
@@ -92,6 +92,7 @@ CLocalMediaPlayEntity::CLocalMediaPlayEntity()
 	m_badplayflag = true;
 	m_bgetflag = false;
 	m_bgetico = false;
+	m_remote_audio_queue = NULL;
 #endif // RVC_OS_WIN
 
 	ZeroMemory(&m_mediaParam, sizeof(MediaPlayParam));
@@ -514,6 +515,37 @@ int CLocalMediaPlayEntity::GetAudioOutDevName(char* strDev, size_t uLen)
 int CLocalMediaPlayEntity::PlayingAudioDataCallback(audio_param_t* param, const void* input, unsigned long uaudiolen)
 {
 	int iRet = -1;
+	if (m_bStartRecord) {
+		if (8000 == param->freq && 1 == param->channels && 1 == param->fmt) {
+			Dbg("%s:%d uaudiolen:%d", __FUNCTION__, __LINE__, uaudiolen);
+			int icount = (uaudiolen + m_leftlen) / RVC_AUDIO_LEN;
+			if (icount > 0) {
+				memcpy(m_audiobuffer + m_leftlen, (char*)input, icount * RVC_AUDIO_LEN - m_leftlen);
+				for (int i = 0; i < icount; i++) {
+					audio_frame frm;
+					char straudio[RVC_AUDIO_LEN] = { 0 };
+					memcpy(straudio, m_audiobuffer + i * RVC_AUDIO_LEN, RVC_AUDIO_LEN);
+					frm.bitspersample = 16;
+					frm.format = param->fmt;
+					frm.data = straudio;
+					frm.framesize = RVC_AUDIO_LEN;
+					frm.nchannels = param->channels;
+					frm.samplespersec = param->freq;
+					if (!m_remote_audio_queue->InsertAudio(&frm)) {
+						Dbg("InsertAudio failed! frameCount:%d", frm.framesize);
+					}
+					else {
+						Dbg("%s:%d InsertAudio success", __FUNCTION__, __LINE__);
+					}
+				}
+				memset(m_audiobuffer, 0, RVC_AUDIO_BUFFER_LEN);
+			}
+			m_leftlen = (uaudiolen + m_leftlen) % RVC_AUDIO_LEN;
+			if ((0 != m_leftlen) && (icount * RVC_AUDIO_LEN < uaudiolen)) {
+				memcpy(m_audiobuffer, (char*)input + icount * RVC_AUDIO_LEN, m_leftlen);
+			}
+		}
+	}
 
 	return iRet;
 }
@@ -595,20 +627,32 @@ void CLocalMediaPlayEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID n
 	const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
 	const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName, const char *pszMessage)
 {
-	if (dwUserCode == LOG_EVT_SELFCHECK_IEBROWSER_IDLE)
-	{
+	if (dwUserCode == LOG_EVT_SELFCHECK_IEBROWSER_IDLE){
 		Dbg("IEBrowser to idle, stop all media!");
 		StopAll();
 	}
+	else if(LOG_EVT_UI_STARTREMOTERECORD == dwUserCode){
+		Dbg("Start remote record.");
+		m_bStartRecord = true;
+		memset(m_audiobuffer, 0, RVC_AUDIO_LEN);
+		m_leftlen = 0;
+		m_remote_audio_queue = new Clibaudioqueue(REC_COMMON_REMOTEAUDIO_SHM_QUEUE);
+	}
+	else if (LOG_EVT_UI_STOPREMOTERECORD == dwUserCode) {
+		Dbg("Stop remote record.");
+		m_bStartRecord = false;
+		if (NULL != m_remote_audio_queue) {
+			delete m_remote_audio_queue;
+			m_remote_audio_queue = NULL;
+		}
+	}
 }
 
 
 void CLocalMediaPlayEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmartPointer<ITransactionContext> pTransactionContext)
 {
 	LOG_FUNCTION();
-
 	ErrorCodeEnum Error = __OnStart(Error_Succeed);
-
 	pTransactionContext->SendAnswer(Error);
 }
 
@@ -657,6 +701,8 @@ void CLocalMediaPlayEntity::OnStarted()
 	loadDefaultMedia();
 
 	GetFunction()->SubscribeLog(m_SubIDIEIdle, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_SELFCHECK_IEBROWSER_IDLE, NULL, false);
+	GetFunction()->SubscribeLog(m_SubIDStartRecord, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTREMOTERECORD, NULL, false);
+	GetFunction()->SubscribeLog(m_SubIDStopRecord, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPREMOTERECORD, NULL, false);
 
 #ifdef RVC_OS_WIN
 	m_scanThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)& qryMedia, this, 0, NULL);
@@ -702,6 +748,9 @@ ErrorCodeEnum CLocalMediaPlayEntity::__OnClose(ErrorCodeEnum preOperationError)
 #endif // RVC_OS_WIN
 	
 	GetFunction()->UnsubscribeLog(m_SubIDIEIdle);
+	GetFunction()->UnsubscribeLog(m_SubIDStartRecord);
+	GetFunction()->UnsubscribeLog(m_SubIDStopRecord);
+
 	return Error_Succeed;
 }
 

+ 16 - 1
Module/mod_localmediaplay/mod_localmediaplay.h

@@ -12,6 +12,7 @@
 #include "../../Other/libmediaplayer/libmediaplayer.h"
 #include "../../Other/libpictureplayer/libpictureplayer.h"
 #include <semaphore.h>
+#include "../../Other/libaudioqueue/libaudioqueue.h"
 #endif // RVC_OS_WIN
 
 
@@ -44,6 +45,14 @@ using namespace LocalMediaPlay;
 #define LOG_EVT_VICE_MONITOR_SET_ERROR	0x31300109
 #define LOG_EVT_NOTICE_PLAY_EARLY_TERM  0x3130010A
 
+#ifndef RVC_AUDIO_LEN
+#define RVC_AUDIO_LEN 320
+#endif // !RVC_AUDIO_LEN
+
+#ifndef RVC_AUDIO_BUFFER_LEN
+#define RVC_AUDIO_BUFFER_LEN 1024*4
+#endif // !RVC_AUDIO_BUFFER_LEN
+
 typedef struct {
 	int nCfgInx;
 	int nWndX;
@@ -158,7 +167,6 @@ private:
 	// 按分隔符分隔字符串
 	void CStringSplit(char *str, char **result, const char *del);
 
-
 	//friend DWORD WINAPI clearOutdata(LPVOID lpv);
 	
 #ifdef RVC_OS_WIN
@@ -183,6 +191,8 @@ private:
 private:
 	int m_id_seq;
 	CUUID m_SubIDIEIdle;
+	CUUID m_SubIDStartRecord;
+	CUUID m_SubIDStopRecord;
 
 #ifdef RVC_OS_WIN
 	// 视频播放对象指针数组
@@ -205,6 +215,10 @@ private:
 	std::string m_lastPlayVideo;
 	DeviceTypeEnum m_eDeviceType;
 
+	bool m_bStartRecord;
+	char m_audiobuffer[RVC_AUDIO_BUFFER_LEN];
+	int m_leftlen;
+
 #ifdef RVC_OS_WIN
 	HANDLE m_scanThread, m_playThread;
 	vector<CWmpPlayConfig> m_defaultVideo;
@@ -222,6 +236,7 @@ private:
 	CSimpleStringA m_strAudioOutDev;
 	bool m_bgetflag;
 	bool m_bgetico;
+	Clibaudioqueue* m_remote_audio_queue;
 #endif // RVC_OS_WIN
 };
 

+ 10 - 12
Module/mod_mediacontroller/capture.cpp

@@ -619,12 +619,10 @@ static void record_audio_data_callback(const void* input, unsigned long audiolen
 			if (!audio_cap->audio_shm_queue->InsertAudio(&frm)) {
 				Dbg("%s:%d InsertAudio to audio_shm_queue failed!", __FUNCTION__, __LINE__);
 			}
-
-			if (audio_cap->bputremote){
-				if (!audio_cap->remote_audio_queue->InsertAudio(&frm)) {
-					Dbg("%s:%d InsertAudio to remote_audio_queue failed!", __FUNCTION__, __LINE__);
-				}
+			else {
+				//Dbg("%s:%d InsertAudio to audio_shm_queue success!", __FUNCTION__, __LINE__);
 			}
+			
 
 			if (eSingleWriteLocal == audio_cap->eType) {
 				fwrite(frm.data, frm.framesize, 1, (FILE*)(audio_cap->pdata));
@@ -689,7 +687,7 @@ static rvc_audio_capture_t *salesrecord_audio_capture_create(rvc_sales_audio_cap
 	if (audio_cap) {
 		audio_cap->parent = cap;
 		audio_cap->audio_shm_queue = new Clibaudioqueue(REC_COMMON_AUDIO_SALES_SHM_QUEUE);
-		audio_cap->remote_audio_queue = new Clibaudioqueue(REC_COMMON_REMOTEAUDIO_SHM_QUEUE);
+		//audio_cap->remote_audio_queue = new Clibaudioqueue(REC_COMMON_REMOTEAUDIO_SHM_QUEUE);
 		audio_cap->iseriesnumber = 0;
 		audio_cap->eType = eUnKnown;
 		audio_cap->pdata = NULL;
@@ -712,11 +710,11 @@ static void salesrecord_audio_capture_destroy(rvc_audio_capture_t *audio_cap)
 			Dbg("set audio_cap audio_shm_queue null");
 		}
 
-		if (NULL != audio_cap->remote_audio_queue) {
-			delete audio_cap->remote_audio_queue;
-			audio_cap->remote_audio_queue = NULL;
-			Dbg("set audio_cap remote_audio_queue null");
-		}
+		//if (NULL != audio_cap->remote_audio_queue) {
+		//	delete audio_cap->remote_audio_queue;
+		//	audio_cap->remote_audio_queue = NULL;
+		//	Dbg("set audio_cap remote_audio_queue null");
+		//}
 
 #ifdef RVC_OS_LINUX
 		if (NULL != audio_cap->paudio_buffer){
@@ -849,7 +847,7 @@ static int video_shm_enqueue(Clibvideoqueue *shm_queue, video_frame *frame, int
 		Dbg("caution: shm_queue video insert shm video failed!");
 		return Error_Unexpect;
 	} else {
-		//Dbg("insert shm video ok!");
+		//Dbg("shm_queue video insert shm video ok!");
 		return Error_Succeed;
 	}
 }

+ 1 - 1
Module/mod_mediacontroller/capture.h

@@ -109,7 +109,7 @@ namespace MediaController {
 		size_t uaudiolen;
 #endif
 		Clibaudioqueue *audio_shm_queue;					// 音频包存储队列
-		Clibaudioqueue* remote_audio_queue;					// 远端音频队列
+		//Clibaudioqueue* remote_audio_queue;				// 远端音频队列
 		rvc_sales_audio_capture_t *parent;
 
 		//setting param