| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/unix/sound.h
- // Purpose: wxSound class
- // Author: Julian Smart, Vaclav Slavik
- // Modified by:
- // Created: 25/10/98
- // Copyright: (c) Julian Smart, Vaclav Slavik
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_SOUND_H_
- #define _WX_SOUND_H_
- #include "wx/defs.h"
- #if wxUSE_SOUND
- #include "wx/object.h"
- // ----------------------------------------------------------------------------
- // wxSound: simple audio playback class
- // ----------------------------------------------------------------------------
- class WXDLLIMPEXP_FWD_ADV wxSoundBackend;
- class WXDLLIMPEXP_FWD_ADV wxSound;
- class WXDLLIMPEXP_FWD_BASE wxDynamicLibrary;
- /// Sound data, as loaded from .wav file:
- class WXDLLIMPEXP_ADV wxSoundData
- {
- public:
- wxSoundData() : m_refCnt(1) {}
- void IncRef();
- void DecRef();
- // .wav header information:
- unsigned m_channels; // num of channels (mono:1, stereo:2)
- unsigned m_samplingRate;
- unsigned m_bitsPerSample; // if 8, then m_data contains unsigned 8bit
- // samples (wxUint8), if 16 then signed 16bit
- // (wxInt16)
- unsigned m_samples; // length in samples:
- // wave data:
- size_t m_dataBytes;
- wxUint8 *m_data; // m_dataBytes bytes of data
- private:
- ~wxSoundData();
- unsigned m_refCnt;
- wxUint8 *m_dataWithHeader; // ditto, but prefixed with .wav header
- friend class wxSound;
- };
- /// Simple sound class:
- class WXDLLIMPEXP_ADV wxSound : public wxSoundBase
- {
- public:
- wxSound();
- wxSound(const wxString& fileName, bool isResource = false);
- wxSound(size_t size, const void* data);
- virtual ~wxSound();
- // Create from resource or file
- bool Create(const wxString& fileName, bool isResource = false);
- // Create from data
- bool Create(size_t size, const void* data);
- bool IsOk() const { return m_data != NULL; }
- // Stop playing any sound
- static void Stop();
- // Returns true if a sound is being played
- static bool IsPlaying();
- // for internal use
- static void UnloadBackend();
- protected:
- bool DoPlay(unsigned flags) const;
- static void EnsureBackend();
- void Free();
- bool LoadWAV(const void* data, size_t length, bool copyData);
- static wxSoundBackend *ms_backend;
- #if wxUSE_LIBSDL && wxUSE_PLUGINS
- // FIXME - temporary, until we have plugins architecture
- static wxDynamicLibrary *ms_backendSDL;
- #endif
- private:
- wxSoundData *m_data;
- };
- // ----------------------------------------------------------------------------
- // wxSoundBackend:
- // ----------------------------------------------------------------------------
- // This is interface to sound playing implementation. There are multiple
- // sound architectures in use on Unix platforms and wxWidgets can use several
- // of them for playback, depending on their availability at runtime; hence
- // the need for backends. This class is for use by wxWidgets and people writing
- // additional backends only, it is _not_ for use by applications!
- // Structure that holds playback status information
- struct wxSoundPlaybackStatus
- {
- // playback is in progress
- bool m_playing;
- // main thread called wxSound::Stop()
- bool m_stopRequested;
- };
- // Audio backend interface
- class WXDLLIMPEXP_ADV wxSoundBackend
- {
- public:
- virtual ~wxSoundBackend() {}
- // Returns the name of the backend (e.g. "Open Sound System")
- virtual wxString GetName() const = 0;
- // Returns priority (higher priority backends are tried first)
- virtual int GetPriority() const = 0;
- // Checks if the backend's audio system is available and the backend can
- // be used for playback
- virtual bool IsAvailable() const = 0;
- // Returns true if the backend is capable of playing sound asynchronously.
- // If false, then wxWidgets creates a playback thread and handles async
- // playback, otherwise it is left up to the backend (will usually be more
- // effective).
- virtual bool HasNativeAsyncPlayback() const = 0;
- // Plays the sound. flags are same flags as those passed to wxSound::Play.
- // The function should periodically check the value of
- // status->m_stopRequested and terminate if it is set to true (it may
- // be modified by another thread)
- virtual bool Play(wxSoundData *data, unsigned flags,
- volatile wxSoundPlaybackStatus *status) = 0;
- // Stops playback (if something is played).
- virtual void Stop() = 0;
- // Returns true if the backend is playing anything at the moment.
- // (This method is never called for backends that don't support async
- // playback.)
- virtual bool IsPlaying() const = 0;
- };
- #endif // wxUSE_SOUND
- #endif // _WX_SOUND_H_
|