Merge branch 'sound-async-unix'
Minor fixes to Unix wxSound implementation, including async API and OSS backend tweaks.
This commit is contained in:
@@ -17,8 +17,11 @@
|
|||||||
This class represents a short sound (loaded from Windows WAV file), that
|
This class represents a short sound (loaded from Windows WAV file), that
|
||||||
can be stored in memory and played.
|
can be stored in memory and played.
|
||||||
|
|
||||||
Currently this class is implemented on Windows and Unix (and uses either
|
Currently this class is implemented on Windows and Unix and can use either
|
||||||
Open Sound System or Simple DirectMedia Layer).
|
Open Sound System (OSS) or Simple DirectMedia Layer (SDL) under the latter.
|
||||||
|
Notice that OSS is not provided any more by most, and maybe even all,
|
||||||
|
Linux systems in 2017 and osspd (OSS Proxy Daemon) package typically needs
|
||||||
|
to be installed to make it work.
|
||||||
|
|
||||||
@library{wxadv}
|
@library{wxadv}
|
||||||
@category{media}
|
@category{media}
|
||||||
|
@@ -224,7 +224,6 @@ bool wxSoundBackendOSS::InitDSP(int dev, const wxSoundData *data)
|
|||||||
if (tmp != stereo)
|
if (tmp != stereo)
|
||||||
{
|
{
|
||||||
wxLogTrace(wxT("sound"), wxT("Unable to set DSP to %s."), stereo? wxT("stereo"):wxT("mono"));
|
wxLogTrace(wxT("sound"), wxT("Unable to set DSP to %s."), stereo? wxT("stereo"):wxT("mono"));
|
||||||
m_needConversion = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp = data->m_samplingRate;
|
tmp = data->m_samplingRate;
|
||||||
@@ -294,7 +293,7 @@ class wxSoundSyncOnlyAdaptor : public wxSoundBackend
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wxSoundSyncOnlyAdaptor(wxSoundBackend *backend)
|
wxSoundSyncOnlyAdaptor(wxSoundBackend *backend)
|
||||||
: m_backend(backend), m_playing(false) {}
|
: m_backend(backend) {}
|
||||||
virtual ~wxSoundSyncOnlyAdaptor()
|
virtual ~wxSoundSyncOnlyAdaptor()
|
||||||
{
|
{
|
||||||
delete m_backend;
|
delete m_backend;
|
||||||
@@ -324,7 +323,6 @@ private:
|
|||||||
friend class wxSoundAsyncPlaybackThread;
|
friend class wxSoundAsyncPlaybackThread;
|
||||||
|
|
||||||
wxSoundBackend *m_backend;
|
wxSoundBackend *m_backend;
|
||||||
bool m_playing;
|
|
||||||
#if wxUSE_THREADS
|
#if wxUSE_THREADS
|
||||||
// player thread holds this mutex and releases it after it finishes
|
// player thread holds this mutex and releases it after it finishes
|
||||||
// playing, so that the main thread knows when it can play sound
|
// playing, so that the main thread knows when it can play sound
|
||||||
@@ -337,12 +335,14 @@ private:
|
|||||||
#if wxUSE_THREADS
|
#if wxUSE_THREADS
|
||||||
wxThread::ExitCode wxSoundAsyncPlaybackThread::Entry()
|
wxThread::ExitCode wxSoundAsyncPlaybackThread::Entry()
|
||||||
{
|
{
|
||||||
|
wxMutexLocker locker(m_adapt->m_mutexRightToPlay);
|
||||||
|
|
||||||
m_adapt->m_backend->Play(m_data, m_flags & ~wxSOUND_ASYNC,
|
m_adapt->m_backend->Play(m_data, m_flags & ~wxSOUND_ASYNC,
|
||||||
&m_adapt->m_status);
|
&m_adapt->m_status);
|
||||||
|
|
||||||
m_data->DecRef();
|
m_data->DecRef();
|
||||||
m_adapt->m_playing = false;
|
m_adapt->m_status.m_playing = false;
|
||||||
m_adapt->m_mutexRightToPlay.Unlock();
|
|
||||||
wxLogTrace(wxT("sound"), wxT("terminated async playback thread"));
|
wxLogTrace(wxT("sound"), wxT("terminated async playback thread"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -355,7 +355,7 @@ bool wxSoundSyncOnlyAdaptor::Play(wxSoundData *data, unsigned flags,
|
|||||||
if (flags & wxSOUND_ASYNC)
|
if (flags & wxSOUND_ASYNC)
|
||||||
{
|
{
|
||||||
#if wxUSE_THREADS
|
#if wxUSE_THREADS
|
||||||
m_mutexRightToPlay.Lock();
|
wxMutexLocker locker(m_mutexRightToPlay);
|
||||||
m_status.m_playing = true;
|
m_status.m_playing = true;
|
||||||
m_status.m_stopRequested = false;
|
m_status.m_stopRequested = false;
|
||||||
data->IncRef();
|
data->IncRef();
|
||||||
@@ -372,13 +372,9 @@ bool wxSoundSyncOnlyAdaptor::Play(wxSoundData *data, unsigned flags,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if wxUSE_THREADS
|
#if wxUSE_THREADS
|
||||||
m_mutexRightToPlay.Lock();
|
wxMutexLocker locker(m_mutexRightToPlay);
|
||||||
#endif
|
#endif
|
||||||
bool rv = m_backend->Play(data, flags, status);
|
return m_backend->Play(data, flags, status);
|
||||||
#if wxUSE_THREADS
|
|
||||||
m_mutexRightToPlay.Unlock();
|
|
||||||
#endif
|
|
||||||
return rv;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -387,15 +383,11 @@ void wxSoundSyncOnlyAdaptor::Stop()
|
|||||||
wxLogTrace(wxT("sound"), wxT("asking audio to stop"));
|
wxLogTrace(wxT("sound"), wxT("asking audio to stop"));
|
||||||
|
|
||||||
#if wxUSE_THREADS
|
#if wxUSE_THREADS
|
||||||
|
wxMutexLocker lock(m_mutexRightToPlay);
|
||||||
|
|
||||||
// tell the player thread (if running) to stop playback ASAP:
|
// tell the player thread (if running) to stop playback ASAP:
|
||||||
m_status.m_stopRequested = true;
|
m_status.m_stopRequested = true;
|
||||||
|
|
||||||
// acquire the mutex to be sure no sound is being played, then
|
|
||||||
// release it because we don't need it for anything (the effect of this
|
|
||||||
// is that calling thread will wait until playback thread reacts to
|
|
||||||
// our request to interrupt playback):
|
|
||||||
m_mutexRightToPlay.Lock();
|
|
||||||
m_mutexRightToPlay.Unlock();
|
|
||||||
wxLogTrace(wxT("sound"), wxT("audio was stopped"));
|
wxLogTrace(wxT("sound"), wxT("audio was stopped"));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user