don't release audio after the sound finishes playing, it ruins GUI responsivity

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25462 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík 2004-02-01 23:33:18 +00:00
parent 64f4500a4a
commit 342dc9287c

View File

@ -75,7 +75,7 @@ class wxSoundBackendSDL : public wxSoundBackend
public:
wxSoundBackendSDL()
: m_initialized(false), m_playing(false), m_audioOpen(false),
m_evtHandler(NULL) {}
m_data(NULL), m_evtHandler(NULL) {}
virtual ~wxSoundBackendSDL();
wxString GetName() const { return _T("Simple DirectMedia Layer"); }
@ -89,6 +89,9 @@ public:
bool IsPlaying() const { return m_playing; }
private:
bool OpenAudio();
void CloseAudio();
bool m_initialized;
bool m_playing, m_audioOpen;
// playback information:
@ -124,6 +127,7 @@ END_EVENT_TABLE()
wxSoundBackendSDL::~wxSoundBackendSDL()
{
Stop();
CloseAudio();
delete m_evtHandler;
}
@ -187,6 +191,51 @@ void wxSoundBackendSDL::FillAudioBuffer(Uint8 *stream, int len)
}
}
bool wxSoundBackendSDL::OpenAudio()
{
if (!m_audioOpen)
{
if (!m_evtHandler)
m_evtHandler = new wxSoundBackendSDLEvtHandler(this);
m_spec.silence = 0;
m_spec.samples = 4096;
m_spec.size = 0;
m_spec.callback = wx_sdl_audio_callback;
m_spec.userdata = (void*)this;
wxLogTrace(_T("sound"), _T("opening SDL audio..."));
if (SDL_OpenAudio(&m_spec, NULL) >= 0)
{
#if wxUSE_LOG_DEBUG
char driver[256];
SDL_AudioDriverName(driver, 256);
wxLogTrace(_T("sound"), _T("opened audio, driver '%s'"),
wxString(driver, wxConvLocal).c_str());
#endif
m_audioOpen = true;
return true;
}
else
{
wxString err(SDL_GetError(), wxConvLocal);
wxLogError(_("Couldn't open audio: %s"), err.c_str());
return false;
}
}
return true;
}
void wxSoundBackendSDL::CloseAudio()
{
if (m_audioOpen)
{
SDL_CloseAudio();
wxLogTrace(_T("sound"), _T("closed audio"));
m_audioOpen = false;
}
}
bool wxSoundBackendSDL::Play(wxSoundData *data, unsigned flags)
{
int format;
@ -199,15 +248,9 @@ bool wxSoundBackendSDL::Play(wxSoundData *data, unsigned flags)
SDL_LockAudio();
if (!m_evtHandler)
m_evtHandler = new wxSoundBackendSDLEvtHandler(this);
data->IncRef();
bool needsOpen = true;
if (m_audioOpen)
{
wxLogTrace(_T("sound"), _T("another sound playing, will be stopped"));
if (format == m_spec.format &&
m_spec.freq == (int)data->m_samplingRate &&
m_spec.channels == data->m_channels)
@ -216,56 +259,32 @@ bool wxSoundBackendSDL::Play(wxSoundData *data, unsigned flags)
}
else
{
SDL_CloseAudio();
m_audioOpen = false;
wxLogTrace(_T("sound"), _T("closed audio"));
CloseAudio();
}
m_data->DecRef();
}
m_playing = true;
m_data = data;
m_pos = 0;
m_loop = (flags & wxSOUND_LOOP);
wxLogTrace(_T("sound"), _T("prepared sound for playback"));
bool status = true;
Stop();
if (needsOpen)
{
m_spec.format = format;
m_spec.freq = data->m_samplingRate;
m_spec.channels = data->m_channels;
m_spec.silence = 0;
m_spec.samples = 4096;
m_spec.size = 0;
m_spec.callback = wx_sdl_audio_callback;
m_spec.userdata = (void*)this;
wxLogTrace(_T("sound"), _T("opening SDL audio..."));
status = (SDL_OpenAudio(&m_spec, NULL) >= 0);
if (status)
if (!OpenAudio())
{
#if wxUSE_LOG_DEBUG
char driver[256];
SDL_AudioDriverName(driver, 256);
wxLogTrace(_T("sound"), _T("opened audio, driver '%s'"),
wxString(driver, wxConvLocal).c_str());
#endif
m_audioOpen = true;
SDL_PauseAudio(0);
}
else
{
wxString err(SDL_GetError(), wxConvLocal);
wxLogError(_("Couldn't open audio: %s"), err.c_str());
SDL_UnlockAudio();
return false;
}
}
SDL_UnlockAudio();
m_playing = true;
m_pos = 0;
m_loop = (flags & wxSOUND_LOOP);
m_data = data;
data->IncRef();
if (!status)
return false;
SDL_PauseAudio(0);
SDL_UnlockAudio();
// wait until playback finishes if called in sync mode:
if (!(flags & wxSOUND_ASYNC))
@ -294,15 +313,12 @@ bool wxSoundBackendSDL::Play(wxSoundData *data, unsigned flags)
void wxSoundBackendSDL::Stop()
{
SDL_LockAudio();
if (m_audioOpen)
SDL_PauseAudio(1);
if (m_data)
{
SDL_CloseAudio();
m_audioOpen = false;
wxLogTrace(_T("sound"), _T("closed audio"));
m_data->DecRef();
m_data = NULL;
}
SDL_UnlockAudio();
}