//----------------------------------------------------------------------------- // Purpose: Eject the disk //----------------------------------------------------------------------------- void CCDAudio::_Eject( int, int ) { DWORD dwReturn; _Stop( 0, 0 ); dwReturn = mciSendCommand(m_uiDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, (DWORD)NULL); ResetCDTimes(); }
bool SFB::Audio::Output::Stop() { LOGGER_DEBUG("org.sbooth.AudioEngine.Output", "Stopping output"); if(!_IsOpen()) return false; if(!_IsRunning()) return true; return _Stop(); }
/** * @ingroup SipStack * @brief SIP stack 을 중지시킨다. * @returns 성공하면 true 를 리턴하고 SIP stack 이 실행되지 않았거나 종료 이벤트 처리 중이면 false 를 리턴한다. */ bool CSipStack::Stop( ) { if( m_bStarted == false || m_bStopEvent ) return false; _Stop(); m_clsCallBackList.clear(); m_bStarted = false; return true; }
void TransportControlGroup::MessageReceived(BMessage* message) { switch (message->what) { case MSG_PLAY: _TogglePlaying(); break; case MSG_STOP: _Stop(); break; case MSG_REWIND: _Rewind(); break; case MSG_FORWARD: _Forward(); break; case MSG_SKIP_BACKWARDS: _SkipBackward(); break; case MSG_SKIP_FORWARD: _SkipForward(); break; case MSG_SET_VOLUME: _UpdateVolume(); break; case MSG_SET_MUTE: _ToggleMute(); break; case MSG_SEEK: _UpdatePosition(); break; default: BView::MessageReceived(message); break; } }
//////////////////////////////////////////////////////////////////////// // 描 述: 启动应用程序 // 作 者: 邵凯田 // 创建时间: 2008-10-10 14:17 // 参数说明: @argc/argv为main输入参数 // @szDate/szTime为编译日期时间 // @bBlock为是否阻塞运行,true为阻塞,false为不阻塞 // 返 回 值: true/false ////////////////////////////////////////////////////////////////////////// bool SApplication::Run(int argc, char* argv[],const char* szDate,const char* szTime,bool bBlock/*=true*/) { m_iArgc = argc; m_ppArgv = (char**)argv; m_sModule = argv[0]; #ifndef _WITHOUT_AGENT_CHANNEL_ m_sAgentIp = "127.0.0.1"; #endif SString err; SString crc = SApi::GenerateCRCByFile(m_sModule,err); m_sModuleCrc = crc; m_sModuleTime.sprintf("%s %s",szDate,szTime); if(m_sModule.findRev('/') >= 0) m_sModule = m_sModule.mid(m_sModule.findRev('/')+1); if(m_sModule.findRev('\\') >= 0) m_sModule = m_sModule.mid(m_sModule.findRev('\\')+1); printf("#########################################################\n"); printf("## SKTBASE Application frame\n"); printf("## Module Name: %s \n",m_sModule.data()); printf("## Description : %s \n",m_sModuleDesc.data()); printf("## Compile Time: %s %s\n",szDate,szTime); printf("## Appbase Ver : V%s \n",m_sAppbaseVer.data()); printf("## Module Ver : V%s \n",m_sModuleVer.data()); printf("## CRC Code : %s \n",crc.data()); printf("#########################################################\n"); SString sTemp=""; if(IsParam("version",sTemp)) { bool bWrite = false; SString sLine; SFile file; if(sTemp.length() > 0) { file.setFileName(sTemp); if(file.open(IO_Truncate)) bWrite = true; } if(bWrite) { sLine.sprintf("#########################################################\n"); file.writeString(sLine); sLine.sprintf("## SKTBASE Application frame\n"); file.writeString(sLine); sLine.sprintf("## Module Name: %s \n",m_sModule.data()); file.writeString(sLine); sLine.sprintf("## Description : %s \n",m_sModuleDesc.data()); file.writeString(sLine); sLine.sprintf("## Compile Time: %s %s\n",szDate,szTime); file.writeString(sLine); sLine.sprintf("## Appbase Ver : V%s \n",m_sAppbaseVer.data()); file.writeString(sLine); sLine.sprintf("## Module Ver : V%s \n",m_sModuleVer.data()); file.writeString(sLine); sLine.sprintf("## CRC Code : %s \n",crc.data()); file.writeString(sLine); sLine.sprintf("#########################################################\n"); file.writeString(sLine); file.close(); } exit(0); abort(); } if(m_sModuleDesc.length() == 0) { printf("ERROR!!! 缺少模块描述信息!请调用基类CSRecApplication::SetModuleDesc方法!\n\n\n"); } if(m_sModuleVer.length() == 0) { printf("ERROR!!! 缺少模块版本信息!请调用基类CSRecApplication::SetVersion方法!\n\n\n"); } #ifndef WIN32 signal(SIGPIPE,SIG_IGN);//忽略管道断开信号 signal(SIGCHLD,SIG_IGN); signal(SIGCLD, SIG_IGN); #endif #ifndef WIN32 if(m_bFork) { //LINUX下将进程设置为守护进程 //printf("@@@@@@@@@@@@begin fork()\n"); if(fork()) { //printf("@@@@@@@@@@@@fork()\n"); exit(0); } } SApi::UsSleep(100000); signal(SIGCHLD,SIG_IGN); #endif SLog::setLogLevel(SLog::LOG_DEBUG); SLog::setModuleName(m_sModule.data()); //预处理命令 SXmlConfig xml; SString sFileName; m_sExePath = SDir::currentDirPath(); if(m_sExePath.right(1) != "/" && m_sExePath.right(1) != "\\") m_sExePath += "/"; sFileName=m_sExePath + "logconfig.xml"; if(!xml.ReadConfig(sFileName)) { LOGWARN("打开<logconfig.xml>文件失败!将无法使用日志记录功能! file=%s",sFileName.data()); } else { sFileName = m_sModule; SBaseConfig *pPrecommand = xml.SearchChild("log<module='"+sFileName+"'>"); if(pPrecommand == NULL) { if(sFileName.right(4).toLower() == ".exe") sFileName = sFileName.left(sFileName.length()-4); pPrecommand = xml.SearchChild("log<module='"+sFileName+"'>"); } if(pPrecommand == NULL) { //没有专用的,找缺省的 pPrecommand = xml.SearchChild("log<module=''>"); } if(pPrecommand != NULL) { //预处理命令 int i,cnt = pPrecommand==NULL?0:pPrecommand->GetChildCount("command"); for(i=0;i<cnt;i++) { SBaseConfig *pCommand = pPrecommand->GetChildNode(i,"command"); if(pCommand == NULL ) continue; SString cmd = pCommand->GetNodeValue(); if(cmd.find("[@modulename]") >= 0) { SString sModule = SLog::getModuleName(); cmd = cmd.replace("[@modulename]",sModule); } ParseCommandLine(cmd); } } } //是否处于调试模式 if(IsParam("debug")) m_bDebugMode = true; if(IsParam("console",sTemp)) { sTemp = sTemp.toLower(); if(sTemp == "off") { //强制关闭控制台的日志输出 m_bLogToConsole = false; ParseCommandLine("log to console off"); } } #ifndef _WITHOUT_AGENT_CHANNEL_ if(IsParam("agentport",sTemp)) { m_iAgentPort = sTemp.toInt(); if(m_iAgentPort == 0) m_iAgentPort = 6666; } #endif if(IsParam("stop")) { if(!_Stop()) { LOGFAULT("停止应用失败!"); //SLog::WaitForLogEmpty(); return false; } return true; } else if(IsParam("restart")) { _Stop(); if(!_Start()) { LOGFAULT("启动应用失败!"); //SLog::WaitForLogEmpty(); return false; } } else { if(!_Start()) { LOGFAULT("启动应用失败!"); //SLog::WaitForLogEmpty(); return false; } } LOGDEBUG("应用服务启动完成!"); if(bBlock) { //阻塞方式运行 #ifndef _WITHOUT_AGENT_CHANNEL_ StartAgent(bBlock); #else while(!m_bHalt) { //等待有人发出退出信号 if(IsClosedExist()) { LOGWARN("收到退出信号! 准备关闭当前进程!"); Stop(); //准备关闭当前进程 this->RemoveClose(); break; } SApi::UsSleep(2000000); } #endif } else { //非阻塞方式运行 #ifndef _WITHOUT_AGENT_CHANNEL_ StartAgent(bBlock); #endif } LOGDEBUG("应用服务已退出!"); //SLog::WaitForLogEmpty(); return true; }
/** * @ingroup SipStack * @brief SIP stack 을 시작한다. SIP stack 쓰레드와 network 수신 쓰레드를 시작한다. * @param clsSetup SIP stack 설정 항목 저장 객체 * @returns 성공하면 true 를 리턴하고 실패하면 false 를 리턴한다. */ bool CSipStack::Start( CSipStackSetup & clsSetup ) { if( m_bStarted || m_bStopEvent ) return false; if( clsSetup.Check() == false ) return false; m_clsSetup = clsSetup; m_clsICT.SetTimerD( m_clsSetup.m_iTimerD ); m_clsNIST.SetTimerJ( m_clsSetup.m_iTimerJ ); m_clsTcpConnectMap.SetStateful( m_clsSetup.m_bStateful ); #ifdef USE_TLS m_clsTlsConnectMap.SetStateful( m_clsSetup.m_bStateful ); #endif InitNetwork(); if( m_clsSetup.m_iLocalUdpPort > 0 ) { m_hUdpSocket = UdpListen( m_clsSetup.m_iLocalUdpPort, NULL, m_clsSetup.m_bIpv6 ); if( m_hUdpSocket == INVALID_SOCKET ) return false; } if( m_clsSetup.m_iLocalTcpPort > 0 ) { m_hTcpSocket = TcpListen( m_clsSetup.m_iLocalTcpPort, 255, NULL, m_clsSetup.m_bIpv6 ); if( m_hTcpSocket == INVALID_SOCKET ) { CLog::Print( LOG_ERROR, "TcpListen(%d) error", m_clsSetup.m_iLocalTcpPort ); _Stop(); return false; } m_clsTcpThreadList.SetMaxSocketPerThread( m_clsSetup.m_iTcpMaxSocketPerThread ); if( m_clsTcpThreadList.Init( m_clsSetup.m_iTcpThreadCount, m_clsSetup.m_iTcpThreadCount, SipTcpThread, this ) == false ) { _Stop(); return false; } if( StartSipTcpListenThread( this ) == false ) { _Stop(); return false; } } #ifdef USE_TLS if( m_clsSetup.m_iLocalTlsPort > 0 ) { if( SSLServerStart( m_clsSetup.m_strCertFile.c_str(), m_clsSetup.m_strCaCertFile.c_str() ) == false ) { _Stop(); return false; } m_hTlsSocket = TcpListen( m_clsSetup.m_iLocalTlsPort, 255, NULL, m_clsSetup.m_bIpv6 ); if( m_hTlsSocket == INVALID_SOCKET ) { CLog::Print( LOG_ERROR, "TcpListen(%d) error", m_clsSetup.m_iLocalTlsPort ); _Stop(); return false; } m_clsTlsThreadList.SetMaxSocketPerThread( m_clsSetup.m_iTcpMaxSocketPerThread ); if( m_clsTlsThreadList.Init( m_clsSetup.m_iTcpThreadCount, m_clsSetup.m_iTcpThreadCount, SipTlsThread, this ) == false ) { _Stop(); return false; } if( StartSipTlsListenThread( this ) == false ) { _Stop(); return false; } } else if( m_clsSetup.m_bTlsClient ) { if( SSLClientStart( ) == false ) { _Stop(); return false; } m_clsTlsThreadList.SetMaxSocketPerThread( m_clsSetup.m_iTcpMaxSocketPerThread ); if( m_clsTlsThreadList.Init( m_clsSetup.m_iTcpThreadCount, m_clsSetup.m_iTcpThreadCount, SipTlsThread, this ) == false ) { _Stop(); return false; } } #endif if( m_clsSetup.m_iLocalUdpPort > 0 ) { if( StartSipUdpThread( this ) == false ) { _Stop(); return false; } } if( m_clsSetup.m_bStateful ) { if( StartSipStackThread( this ) == false ) { _Stop(); return false; } } if( m_clsSetup.m_iTcpCallBackThreadCount > 0 ) { for( int i = 0; i < m_clsSetup.m_iTcpCallBackThreadCount; ++i ) { if( StartSipQueueThread( this ) == false ) { _Stop(); return false; } } } m_bStarted = true; return true; }
//----------------------------------------------------------------------------- // Purpose: Play cd // Input : track - // looping - //----------------------------------------------------------------------------- void CCDAudio::_Play( int track, int looping ) { int mins, secs; DWORD dwm_flPlayTime; DWORD dwReturn; MCI_PLAY_PARMS mciPlayParms; MCI_STATUS_PARMS mciStatusParms; if (!m_bEnabled) return; if (!m_bIsValid) { GetAudioDiskInfo(); if (!m_bIsValid) return; } track = m_rgRemapCD[track]; if (track < 1 || track > m_nMaxTrack) { return; } // don't try to play a non-audio track mciStatusParms.dwItem = MCI_CDA_STATUS_TYPE_TRACK; mciStatusParms.dwTrack = track; dwReturn = mciSendCommand(m_uiDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK | MCI_WAIT, (DWORD) (LPVOID) &mciStatusParms); if (dwReturn) { char szErr[256]; int nErr = 256; mciGetErrorString(dwReturn, szErr, nErr); return; } if (mciStatusParms.dwReturn != MCI_CDA_TRACK_AUDIO) { return; } // get the length of the track to be played mciStatusParms.dwItem = MCI_STATUS_LENGTH; mciStatusParms.dwTrack = track; dwReturn = mciSendCommand(m_uiDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_TRACK | MCI_WAIT, (DWORD) (LPVOID) &mciStatusParms); if (dwReturn) { return; } if (m_bIsPlaying) { if (m_nPlayTrack == track) return; _Stop( 0, 0 ); } dwm_flPlayTime = mciStatusParms.dwReturn; mciPlayParms.dwFrom = MCI_MAKE_TMSF(track, 0, 0, 0); mciPlayParms.dwTo = (mciStatusParms.dwReturn << 8) | track; mciPlayParms.dwCallback = (DWORD)game->GetMainWindow(); dwReturn = mciSendCommand(m_uiDeviceID, MCI_PLAY, MCI_NOTIFY | MCI_FROM | MCI_TO, (DWORD)(LPVOID) &mciPlayParms); if (dwReturn) { return; } // Clear any old data. ResetCDTimes(); m_dStartTime = Sys_FloatTime(); mins = MCI_MSF_MINUTE(dwm_flPlayTime); secs = MCI_MSF_SECOND(dwm_flPlayTime); m_flPlayTime = (float)(60.0f * mins + (float) secs ); m_bIsLooping = looping ? true : false; m_nPlayTrack = track; m_bIsPlaying = true; if (m_flVolume == 0.0) _Pause ( 0, 0 ); }