// Audio encoding main process int CAudioEncoder::ThreadMain(void) { CMsg* pMsg; bool stop = false; debug_message("audio encoder thread %s %s %s start", Profile()->GetName(), Profile()->GetStringValue(CFG_AUDIO_ENCODER), Profile()->GetStringValue(CFG_AUDIO_ENCODING)); while (stop == false && SDL_SemWait(m_myMsgQueueSemaphore) == 0) { pMsg = m_myMsgQueue.get_message(); if (pMsg != NULL) { switch (pMsg->get_value()) { case MSG_NODE_STOP_THREAD: DoStopAudio(); stop = true; break; case MSG_NODE_START: // DoStartTransmit(); Anything ? break; case MSG_NODE_STOP: DoStopAudio(); break; case MSG_SINK_FRAME: { uint32_t dontcare; CMediaFrame *mf = (CMediaFrame*)pMsg->get_message(dontcare); if (m_stop_thread == false) ProcessAudioFrame(mf); if (mf->RemoveReference()) { delete mf; } break; } } delete pMsg; } } while ((pMsg = m_myMsgQueue.get_message()) != NULL) { if (pMsg->get_value() == MSG_SINK_FRAME) { uint32_t dontcare; CMediaFrame *mf = (CMediaFrame*)pMsg->get_message(dontcare); if (mf->RemoveReference()) { delete mf; } } delete pMsg; } if (m_audioResample != NULL) { for (uint ix = 0; ix < m_audioDstChannels; ix++) { st_resample_stop(m_audioResample[ix]); m_audioResample[ix] = NULL; } free(m_audioResample); } CHECK_AND_FREE(m_audioPreEncodingBuffer); debug_message("audio encoder thread %s exit", Profile()->GetName()); return 0; }
int CLoopFeederSink::ThreadMain(void) { while (SDL_SemWait(m_myMsgQueueSemaphore) == 0) { CMsg* pMsg = m_myMsgQueue.get_message(); if (pMsg != NULL) { switch (pMsg->get_value()) { case MSG_NODE_STOP_THREAD: DoStopSink(); delete pMsg; return 0; case MSG_NODE_START: DoStartSink(); break; case MSG_NODE_STOP: DoStopSink(); break; case MSG_SINK_FRAME: uint32_t dontcare; DoWriteFrame((CMediaFrame*)pMsg->get_message(dontcare)); break; } delete pMsg; } } return -1; }
int CTextEncoder::ThreadMain (void) { CMsg* pMsg; bool stop = false; Init(); m_textDstType = GetFrameType(); double temp = Profile()->GetFloatValue(CFG_TEXT_REPEAT_TIME_SECS); temp *= 1000.0; uint32_t wait_time = (uint32_t)temp; while (stop == false) { int rc = SDL_SemWaitTimeout(m_myMsgQueueSemaphore, wait_time); if (rc == 0) { pMsg = m_myMsgQueue.get_message(); if (pMsg != NULL) { switch (pMsg->get_value()) { case MSG_NODE_STOP_THREAD: debug_message("text %s stop received", Profile()->GetName()); DoStopText(); stop = true; break; case MSG_NODE_START: // DoStartTransmit(); Anything ? break; case MSG_NODE_STOP: DoStopText(); break; case MSG_SINK_FRAME: { uint32_t dontcare; CMediaFrame *mf = (CMediaFrame*)pMsg->get_message(dontcare); if (m_stop_thread == false) ProcessTextFrame(mf); if (mf->RemoveReference()) { delete mf; } break; } } delete pMsg; } } else if (rc == SDL_MUTEX_TIMEDOUT) { SendFrame(GetTimestamp()); } } while ((pMsg = m_myMsgQueue.get_message()) != NULL) { if (pMsg->get_value() == MSG_SINK_FRAME) { uint32_t dontcare; CMediaFrame *mf = (CMediaFrame*)pMsg->get_message(dontcare); if (mf->RemoveReference()) { delete mf; } } delete pMsg; } debug_message("text encoder %s exit", Profile()->GetName()); return 0; }
int main (int argc, char **argv) { SDL_sem *master_sem; CClientProcess proc; CMsgQueue master_queue; argv++; argc--; int deb = 0; if (*argv[0] == '-') { argv++; argc--; deb = 1; } open_output("wmp4player.log"); if (proc.enable_communication(deb) < 0) { printf("Could not enable communications\n"); Sleep(10 * 1000); close_output(); return -1; } initialize_plugins(&config); config.InitializeIndexes(); config.ReadVariablesFromRegistry("Software\\Mpeg4ip", "Config"); psptr = NULL; master_sem = NULL; if (*argv == NULL) { proc.initial_response(-1, psptr,"No argument to process"); } else { rtsp_set_error_func(library_message); rtp_set_error_msg_func(library_message); sdp_set_error_func(library_message); http_set_error_func(library_message); master_sem = SDL_CreateSemaphore(0); psptr = start_session(&master_queue, master_sem, NULL, *argv, NULL, config.get_config_value(CONFIG_VOLUME), 100, 100, screen_size); if (psptr == NULL) { proc.initial_response(-1, NULL, NULL); } else { proc.initial_response(0, psptr, psptr->get_message()); } } // Either way - we need to loop and wait until we get the // terminate message int running = 0; int state = 0; while (running == 0) { CMsg *msg; running = proc.receive_messages(psptr); while ((msg = master_queue.get_message()) != NULL) { switch (msg->get_value()) { case MSG_SESSION_FINISHED: proc.send_message(GUI_MSG_SESSION_FINISHED); break; case MSG_SESSION_WARNING: proc.send_string(GUI_MSG_SESSION_WARNING, psptr->get_message()); break; case MSG_SESSION_ERROR: player_error_message("error is \"%s\"", psptr->get_message()); proc.send_string(GUI_MSG_SESSION_ERROR, psptr->get_message()); break; case MSG_RECEIVED_QUIT: proc.send_message(GUI_MSG_RECEIVED_QUIT); break; case MSG_SDL_KEY_EVENT: uint32_t len; void *sdl_event = (void *)msg->get_message(len); proc.send_message(GUI_MSG_SDL_KEY, sdl_event, len); break; } delete msg; } if (psptr != NULL) state = psptr->sync_thread(state); } if (psptr != NULL) { delete psptr; } if (master_sem != NULL) { SDL_DestroySemaphore(master_sem); } // remove invalid global ports config.WriteVariablesToRegistry("Software\\Mpeg4ip", "Config"); close_plugins(); close_output(); return 0; }