Pārlūkot izejas kodu

Z991239-1954 #comment fix: 解决从框架直接kill localplayer实体失败问题

陈礼鹏80274480 4 gadi atpakaļ
vecāks
revīzija
582cc3a60f

+ 2 - 2
Module/mod_counterconnector/mod_counterconnector.cpp

@@ -187,7 +187,7 @@ using namespace CounterConnector;
 				}
 				CSimpleStringA strValue;
 				GetFunction()->GetSysVar("CallState", strValue);
-				Dbg("摘机,and CallState is %s.", strValue);
+				Dbg("摘机,and CallState is %s.", strValue.GetData());
 			}
 			break;
 		case EVENT_MOD_CONNECT_GPIO_HANDFREE:
@@ -199,7 +199,7 @@ using namespace CounterConnector;
 				}
 				CSimpleStringA strValue;
 				GetFunction()->GetSysVar("CallState", strValue);
-				Dbg("挂机,and CallState is %s.", strValue);
+				Dbg("挂机,and CallState is %s.", strValue.GetData());
 			}
 			break;
 		case EVENT_MOD_CONNECT_PICKUP_CALL: // 提机呼叫

+ 1 - 1
Module/mod_customeraware/mod_customeraware.cpp

@@ -76,7 +76,7 @@ public:
 			else
 			{
 				Func->GetSysVar(SYSVAR_DESKTOPTYPE, strValue);
-				Dbg("Desktop type is : %c",strValue);
+				Dbg("Desktop type is : %c",strValue.GetData());
 			}
 		}
 

+ 16 - 5
Module/mod_localmediaplay/mod_localmediaplay.cpp

@@ -47,7 +47,14 @@ void* queryMedia(void* param)
 	while (true)
 	{
 		curEntity->m_mediaManage.InitResourceListByLocal();
-		sleep(3600);
+		{
+			struct timespec ts;
+			clock_gettime(CLOCK_REALTIME, &ts);
+			ts.tv_sec += 3600;
+			if (0 == sem_timedwait(&curEntity->m_scanexit_sem, &ts)) {
+				break;
+			}
+		}
 	}
 
 	return 0;
@@ -91,10 +98,11 @@ CLocalMediaPlayEntity::~CLocalMediaPlayEntity()
 		m_scanThread = NULL;
 	}
 #else
-	if (0 == pthread_kill(m_scanThreadId, 0))
-	{
-		pthread_cancel(m_scanThreadId);
+	sem_post(&m_scanexit_sem);
+	if (0 == pthread_join(m_scanThreadId, NULL)){
+		Dbg("pthread join scanThreadId success.");
 	}
+	sem_destroy(&m_scanexit_sem);
 #endif // RVC_OS_WIN
 }
 
@@ -522,7 +530,6 @@ void CLocalMediaPlayEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmar
 ErrorCodeEnum CLocalMediaPlayEntity::__OnStart(ErrorCodeEnum preOperationError)
 {
 	LOG_FUNCTION();
-
 #ifdef RVC_OS_WIN
 	//toolkit_setenv("SDL_AUDIODRIVER", "winmm");
 #endif // RVC_OS_WIN
@@ -568,6 +575,10 @@ ErrorCodeEnum CLocalMediaPlayEntity::__OnStart(ErrorCodeEnum preOperationError)
 	else{
 		Dbg("create queryMedia thread failed.");
 	}
+	if (0 != sem_init(&m_scanexit_sem, 0, 0)) {
+		Dbg("create m_scanexit_sem sem failed.");
+	}
+	
 #endif // RVC_OS_WIN
 
 	return Error_Succeed;

+ 2 - 0
Module/mod_localmediaplay/mod_localmediaplay.h

@@ -11,6 +11,7 @@
 #include <unistd.h>
 #include "../../Other/libmediaplayer/libmediaplayer.h"
 #include "../../Other/libpictureplayer/libpictureplayer.h"
+#include <semaphore.h>
 #endif // RVC_OS_WIN
 
 
@@ -183,6 +184,7 @@ private:
 	vector<CPicPlayConfig> m_defaultPic;
 	pthread_t m_uMediaPlayThreadId;
 	bool m_badplayflag;
+	sem_t m_scanexit_sem;
 #endif // RVC_OS_WIN
 };
 

+ 8 - 4
Other/libaudioframework/audiomicspkpulse.c

@@ -19,6 +19,9 @@
 #define AUDIO_STRM_ON       1
 #define AUDIO_STRM_OFF      0
 
+#ifndef RVC_PA_ADJUST_LATENCY_PROTOCOL_VERSION
+#define RVC_PA_ADJUST_LATENCY_PROTOCOL_VERSION 13
+#endif
 
 static uint32_t latency_ms = 10; // requested initial latency in milisec: 0 use max
 static pa_usec_t latency = 0; //real latency in usec (for timestamping)
@@ -599,7 +602,7 @@ void* pulse_read_audio(void* data)
 
 	if (r < 0)
 	{
-		audio_log_v(AUDIO_LOG_LEVEL_INFO, "AUDIO: (pulse audio) pa_stream_connect_record failed");
+		audio_log_v(AUDIO_LOG_LEVEL_INFO, "AUDIO: (pulse audio) pa_stream_connect_record failed for %s.", pa_context_errno(pa_ctx));
 		finish(pa_ctx, pa_ml);
 		return ((void*)-1);
 	}
@@ -670,9 +673,9 @@ void* pulse_write_audio(void* data)
 	pa_mlapi = pa_mainloop_get_api(pa_ml);
 	play_pa_ctx = pa_context_new(pa_mlapi, "rvc play api");
 
-	if (pa_context_connect(pa_ctx, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) {
-		audio_log_v(AUDIO_LOG_LEVEL_INFO, "AUDIO: PULSE - unable to connect to server: pa_context_connect failed");
-		finish(pa_ctx, pa_ml);
+	if (PA_OK != pa_context_connect(play_pa_ctx, NULL, PA_CONTEXT_NOFLAGS, NULL)) {
+		audio_log_v(AUDIO_LOG_LEVEL_INFO, "AUDIO: PULSE - unable to connect to server: pa_context_connect failed for %s.", pa_context_errno(play_pa_ctx));
+		finish(play_pa_ctx, pa_ml);
 		return ((void*)-1);
 	}
 
@@ -712,6 +715,7 @@ void* pulse_write_audio(void* data)
 		audio_log_v(AUDIO_LOG_LEVEL_INFO, "pulse audio pa_stream_new failed (chan:%d rate:%d) for %s.", ss.channels, ss.rate, pa_context_errno(play_pa_ctx));
 	}
 
+	audio_log_v(AUDIO_LOG_LEVEL_INFO, "stream state is %d", pa_stream_get_state(playstream));
 	/* define the callbacks */
 	pa_stream_set_write_callback(playstream, stream_write_request_cb, (void*)audio_ctx);
 

+ 2 - 0
Other/libaudioframework/audiomicspkpulse.h

@@ -28,6 +28,8 @@ extern "C" {
 #define NSEC_PER_SEC 1000000000LL
 #endif
 
+	
+
 #define pa_memzero(x,l) (memset((x), 0, (l)))
 #define pa_zero(x) (pa_memzero(&(x), sizeof(x)))
 

+ 11 - 20
Other/libmediaplayer/player.cpp

@@ -191,20 +191,6 @@ CMediaPlayer::CMediaPlayer(CMediaHostApi* pHostApi)
 	else {
 		m_hostapi->Debug("new CMediaPlayer failed!");
 	}
-
-	Uint32 uRet = SDL_WasInit(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER);
-
-	if (0 == uRet){
-		if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER))
-		{
-			m_hostapi->Debug("Could not initialize SDL - %s", SDL_GetError());
-			m_hostapi->Debug("(Did you set the DISPLAY variable?)");
-		}
-		else {
-			uRet = SDL_WasInit(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER);
-			m_hostapi->Debug("initialize SDL success, and init ret = %d.", uRet);
-		}
-	}
 }
 
 CMediaPlayer::~CMediaPlayer()
@@ -217,11 +203,6 @@ CMediaPlayer::~CMediaPlayer()
 	if(NULL != m_piconpath){
 		av_free(m_piconpath);
 	}
-
-	Uint32 uRet = SDL_WasInit(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER);
-	if (0 != uRet){
-		SDL_Quit();
-	}
 }
 
 
@@ -349,11 +330,19 @@ int CMediaPlayer::Init(rvc_media_player_param_t* pMedia_Player)
 
 	m_player_stat->abort_request = 0;
 
+	if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER))
+	{
+		m_hostapi->Debug("Could not initialize SDL - %s", SDL_GetError());
+		m_hostapi->Debug("(Did you set the DISPLAY variable?)");
+	}
+	else {
+		iRet = 0;
+	}
+
 	if (m_player_stat->bvice_monitor){
 		if (0 == GetViceVideoDisplayInfo(&m_player_stat->iDisplayCx, &m_player_stat->iDisplayCy, &m_player_stat->iDisplayWidth, &m_player_stat->iDisplayHeight)){
 			m_hostapi->Debug("display cx is %d, cy is %d, width is %d, height is %d.", m_player_stat->iDisplayCx, m_player_stat->iDisplayCy, m_player_stat->iDisplayWidth, m_player_stat->iDisplayHeight);
 		}
-
 	}
 	
 	iRet = 0;
@@ -475,6 +464,8 @@ int CMediaPlayer::ExitMediaPlayingThread()
 
 	avformat_network_deinit();
 
+	SDL_Quit();
+
 	iRet = 0;
 
 	return iRet;