string SoundPlugin::fullName(const char *name) { string sound; if ((name == NULL) || (*name == 0)) return sound; #ifdef WIN32 char c = name[0]; if (((((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))) && (name[1] == ':')) || ((c == '\\') && (name[1] == '\\'))){ #else if (name[0] == '/'){ #endif sound = name; }else{ sound = "sounds/"; sound += name; sound = app_file(sound.c_str()); } return sound; } void SoundPlugin::playSound(const char *s) { if ((s == NULL) || (*s == 0)) return; string sound = fullName(s); #ifdef WIN32 sndPlaySoundA(sound.c_str(), SND_ASYNC | SND_NODEFAULT); #else #ifdef USE_KDE if (getUseArts()){ KAudioPlayer::play(sound.c_str()); return; } #endif ExecParam p; p.cmd = getPlayer(); p.arg = sound.c_str(); Event e(EventExec, &p); e.process(); #endif } #ifdef WIN32 /** * DLL's entry point **/ int WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { return TRUE; } /** * This is to prevent the CRT from loading, thus making this a smaller * and faster dll. **/ extern "C" BOOL __stdcall _DllMainCRTStartup( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { return DllMain( hinstDLL, fdwReason, lpvReserved ); }
string SoundPlugin::fullName(const char *name) { string sound; if ((name == NULL) || (*name == 0)) return sound; #ifdef WIN32 char c = name[0]; if (((((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))) && (name[1] == ':')) || ((c == '\\') && (name[1] == '\\'))){ #else if (name[0] == '/'){ #endif sound = name; }else{ sound = "sounds/"; sound += name; sound = app_file(sound.c_str()); } return sound; } void SoundPlugin::playSound(const char *s) { if ((s == NULL) || (*s == 0)) return; string sound = fullName(s); // check whether file is available if (!QFile::exists(QString(sound.c_str()))) return; bool bSound = QSound::available(); #ifdef USE_KDE if (getUseArts()){ KAudioPlayer::play(sound.c_str()); return; } bSound = false; #endif if (bSound){ QSound s(sound.c_str()); s.play(); return; } ExecParam p; p.cmd = getPlayer(); if (*p.cmd == 0) return; p.arg = sound.c_str(); Event e(EventExec, &p); e.process(); } #ifdef WIN32 #include <windows.h> /** * DLL's entry point **/ int WINAPI DllMain(HINSTANCE, DWORD, LPVOID) { return TRUE; } /** * This is to prevent the CRT from loading, thus making this a smaller * and faster dll. **/ extern "C" BOOL __stdcall _DllMainCRTStartup( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { return DllMain( hinstDLL, fdwReason, lpvReserved ); }
string SoundPlugin::fullName(const char *name) { string sound=""; string str_name = name; if ((name == NULL) || (*name == 0) || (str_name == "(nosound)")) return sound; #ifdef WIN32 char c = name[0]; if (((((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))) && (name[1] == ':')) || ((c == '\\') && (name[1] == '\\'))){ #else if (name[0] == '/'){ #endif sound = name; }else{ sound = "sounds/"; sound += name; sound = app_file(sound.c_str()); } return sound; } void SoundPlugin::playSound(const char *s) { if ((s == NULL) || (*s == 0)) return; if (m_current == s) return; for (list<string>::iterator it = m_queue.begin(); it != m_queue.end(); ++it){ if ((*it) == s) return; } m_queue.push_back(s); if (m_sound == NULL) processQueue(); } void SoundPlugin::processQueue() { if (!m_current.empty() || m_queue.empty()) return; m_current = m_queue.front(); m_queue.erase(m_queue.begin()); string sound = fullName(m_current.c_str()); // check whether file is available if (!QFile::exists(QString(sound.c_str()))) { m_current=""; return; } #ifdef USE_KDE if (getUseArts()){ KAudioPlayer::play(sound.c_str()); m_checkTimer->start(WAIT_SOUND_TIMEOUT); m_current = ""; return; // arts } bool bSound = false; #elif WIN32 bool bSound = true; #else /* If there is an external player selected, don't use Qt Check first for getPlayer() since QSound::available() can take 5 seconds to return a value */ bool bSound = !getPlayer() && QSound::available(); #endif if (bSound){ if (!QSound::available()){ m_queue.clear(); m_current = ""; return; } if (m_sound) delete m_sound; m_sound = NULL; m_sound = new QSound(sound.c_str()); m_sound->play(); #if COMPAT_QT_VERSION >= 0x030000 m_checkTimer->start(CHECK_SOUND_TIMEOUT); #else m_checkTimer->start(WAIT_SOUND_TIMEOUT); #endif m_current = ""; return; // QSound } #ifndef WIN32 ExecParam p; p.cmd = getPlayer(); if (*p.cmd == 0) { m_current=""; return; } p.arg = sound.c_str(); Event e(EventExec, &p); m_player = (int)e.process(); if (m_player == 0){ log(L_WARN, "Can't execute player"); m_queue.clear(); } m_current = ""; return; // external Player #endif } void SoundPlugin::checkSound() { bool bDone = true; #if COMPAT_QT_VERSION >= 0x030000 if (m_sound && !m_sound->isFinished()) bDone = false; #endif if (bDone){ m_checkTimer->stop(); if (m_sound) delete m_sound; m_sound = NULL; m_current = ""; processQueue(); } }