]> git.saurik.com Git - wxWidgets.git/blob - include/wx/unix/sound.h
Common code for the same handling of wxSL_INVERSE.
[wxWidgets.git] / include / wx / unix / sound.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: sound.h
3 // Purpose: wxSound class
4 // Author: Julian Smart, Vaclav Slavik
5 // Modified by:
6 // Created: 25/10/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart, Vaclav Slavik
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifndef _WX_SOUND_H_
13 #define _WX_SOUND_H_
14
15 #include "wx/defs.h"
16
17 #if wxUSE_SOUND
18
19 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
20 #pragma interface "sound.h"
21 #endif
22
23 #include "wx/object.h"
24
25 // ----------------------------------------------------------------------------
26 // wxSound: simple audio playback class
27 // ----------------------------------------------------------------------------
28
29 class wxSoundBackend;
30 class wxSound;
31 class wxDynamicLibrary;
32
33 /// Sound data, as loaded from .wav file:
34 class wxSoundData
35 {
36 public:
37 wxSoundData() : m_refCnt(1) {}
38 void IncRef();
39 void DecRef();
40
41 // .wav header information:
42 unsigned m_channels; // num of channels (mono:1, stereo:2)
43 unsigned m_samplingRate;
44 unsigned m_bitsPerSample; // if 8, then m_data contains unsigned 8bit
45 // samples (wxUint8), if 16 then signed 16bit
46 // (wxInt16)
47 unsigned m_samples; // length in samples:
48
49 // wave data:
50 size_t m_dataBytes;
51 wxUint8 *m_data; // m_dataBytes bytes of data
52
53 private:
54 ~wxSoundData();
55 unsigned m_refCnt;
56 wxUint8 *m_dataWithHeader; // ditto, but prefixed with .wav header
57 friend class wxSound;
58 };
59
60
61 /// Simple sound class:
62 class wxSound : public wxSoundBase
63 {
64 public:
65 wxSound();
66 wxSound(const wxString& fileName, bool isResource = false);
67 wxSound(int size, const wxByte* data);
68 ~wxSound();
69
70 // Create from resource or file
71 bool Create(const wxString& fileName, bool isResource = false);
72 // Create from data
73 bool Create(int size, const wxByte* data);
74
75 bool IsOk() const { return m_data != NULL; }
76
77 // Stop playing any sound
78 static void Stop();
79
80 // Returns true if a sound is being played
81 static bool IsPlaying();
82
83 // for internal use
84 static void UnloadBackend();
85
86 protected:
87 bool DoPlay(unsigned flags) const;
88
89 static void EnsureBackend();
90 void Free();
91 bool LoadWAV(const wxUint8 *data, size_t length, bool copyData);
92
93 static wxSoundBackend *ms_backend;
94 #if wxUSE_LIBSDL && wxUSE_PLUGINS
95 // FIXME - temporary, until we have plugins architecture
96 static wxDynamicLibrary *ms_backendSDL;
97 #endif
98
99 private:
100 wxSoundData *m_data;
101 };
102
103
104 // ----------------------------------------------------------------------------
105 // wxSoundBackend:
106 // ----------------------------------------------------------------------------
107
108 // This is interface to sound playing implementation. There are multiple
109 // sound architectures in use on Unix platforms and wxWidgets can use several
110 // of them for playback, depending on their availability at runtime; hence
111 // the need for backends. This class is for use by wxWidgets and people writing
112 // additional backends only, it is _not_ for use by applications!
113
114 // Structure that holds playback status information
115 struct wxSoundPlaybackStatus
116 {
117 // playback is in progress
118 bool m_playing;
119 // main thread called wxSound::Stop()
120 bool m_stopRequested;
121 };
122
123 // Audio backend interface
124 class wxSoundBackend
125 {
126 public:
127 virtual ~wxSoundBackend() {}
128
129 // Returns the name of the backend (e.g. "Open Sound System")
130 virtual wxString GetName() const = 0;
131
132 // Returns priority (higher priority backends are tried first)
133 virtual int GetPriority() const = 0;
134
135 // Checks if the backend's audio system is available and the backend can
136 // be used for playback
137 virtual bool IsAvailable() const = 0;
138
139 // Returns true if the backend is capable of playing sound asynchronously.
140 // If false, then wxWidgets creates a playback thread and handles async
141 // playback, otherwise it is left up to the backend (will usually be more
142 // effective).
143 virtual bool HasNativeAsyncPlayback() const = 0;
144
145 // Plays the sound. flags are same flags as those passed to wxSound::Play.
146 // The function should periodically check the value of
147 // status->m_stopRequested and terminate if it is set to true (it may
148 // be modified by another thread)
149 virtual bool Play(wxSoundData *data, unsigned flags,
150 volatile wxSoundPlaybackStatus *status) = 0;
151
152 // Stops playback (if something is played).
153 virtual void Stop() = 0;
154
155 // Returns true if the backend is playing anything at the moment.
156 // (This method is never called for backends that don't support async
157 // playback.)
158 virtual bool IsPlaying() const = 0;
159 };
160
161
162 #endif // wxUSE_SOUND
163
164 #endif