]> git.saurik.com Git - wxWidgets.git/blame - src/osx/sound_osx.cpp
Fix for #15520: wxRichTextCtrl: Drawing the selection doesn't respect its container...
[wxWidgets.git] / src / osx / sound_osx.cpp
CommitLineData
3b3d8b97
SC
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/osx/sound_osx.cpp
3// Purpose: wxSound class common osx code
4// Author: Stefan Csomor
ce00f59b 5// Modified by:
3b3d8b97 6// Created: 2009-09-01
3b3d8b97
SC
7// Copyright: (c) Stefan Csomor
8// Licence: wxWindows licence
9/////////////////////////////////////////////////////////////////////////////
10
11// For compilers that support precompilation, includes "wx.h".
12#include "wx/wxprec.h"
13
14#if wxUSE_SOUND
15
16#include "wx/sound.h"
17
18#ifndef WX_PRECOMP
19 #include "wx/object.h"
20 #include "wx/string.h"
21 #include "wx/intl.h"
22 #include "wx/log.h"
23 #include "wx/timer.h"
24#endif
25
26#include "wx/file.h"
27
28#include "wx/vector.h"
29
30class wxSoundTimer : public wxTimer
31{
32public:
33 wxSoundTimer(wxSoundData* snd)
34 : m_sound(snd)
35 {
36 }
ce00f59b 37
3b3d8b97
SC
38 virtual ~wxSoundTimer()
39 {
40 Stop();
509da835
KO
41 if (m_sound)
42 m_sound->DoStop();
3b3d8b97 43 }
ce00f59b 44
3b3d8b97
SC
45 void Notify()
46 {
509da835
KO
47 if (m_sound)
48 m_sound->SoundTask();
3b3d8b97 49 }
ce00f59b 50
3b3d8b97
SC
51protected:
52 wxSoundData* m_sound;
53};
54
55wxVector<wxSoundData*> s_soundsPlaying;
56
57wxSoundData::wxSoundData()
58{
59 m_pTimer = NULL;
509da835 60 m_markedForDeletion = false;
3b3d8b97
SC
61}
62
63wxSoundData::~wxSoundData()
64{
65}
66
509da835
KO
67void wxSoundData::MarkForDeletion()
68{
69 m_markedForDeletion = true;
70}
71
3b3d8b97
SC
72void wxSoundData::Stop()
73{
74 DoStop();
5276b0a5 75 wxDELETE(m_pTimer);
3b3d8b97
SC
76}
77
78//Time between timer calls
79#define MOVIE_DELAY 100
80
81void wxSoundData::SoundTask()
82{
83}
84
85void wxSoundData::CreateAndStartTimer()
86{
87 //Start timer and play movie asyncronously
88 m_pTimer = new wxSoundTimer(this);
89 m_pTimer->Start(MOVIE_DELAY, wxTIMER_CONTINUOUS);
90}
91
ce00f59b 92wxSound::wxSound()
3b3d8b97
SC
93{
94 Init();
95}
96
97wxSound::wxSound(const wxString& sFileName, bool isResource)
98{
99 Init();
100 Create(sFileName, isResource);
101}
102
c559c4b3 103wxSound::wxSound(size_t size, const void* data)
3b3d8b97
SC
104{
105 Init();
106 Create( size, data );
107}
108
109wxSound::~wxSound()
110{
509da835
KO
111 // if the sound is in a playing state, just mark it to be deleted and
112 // delete it after it plays. Otherwise, async sounds created on the stack
113 // may never get the chance to play.
114 bool isPlaying = false;
115 for ( wxVector<wxSoundData*>::reverse_iterator s = s_soundsPlaying.rbegin();
116 s != s_soundsPlaying.rend(); ++s )
117 {
118 if (*s == m_data)
119 {
120 isPlaying = true;
121 break;
122 }
123 }
ce00f59b 124
509da835
KO
125 if (isPlaying)
126 m_data->MarkForDeletion();
127 else
128 delete m_data;
3b3d8b97
SC
129}
130
131void wxSound::Init()
132{
133 m_data = NULL;
134}
135
136bool wxSound::DoPlay(unsigned flags) const
137{
138 if ( m_data )
139 {
140 s_soundsPlaying.push_back(m_data);
141 if ( !m_data->Play(flags) )
142 s_soundsPlaying.pop_back();
143 }
ce00f59b 144
3b3d8b97
SC
145 return false;
146}
147
148bool wxSound::IsPlaying()
149{
150 return s_soundsPlaying.size() > 0;
151}
152
153void wxSound::Stop()
154{
155 for ( wxVector<wxSoundData*>::reverse_iterator s = s_soundsPlaying.rbegin();
156 s != s_soundsPlaying.rend(); ++s )
157 {
158 (*s)->Stop();
159 }
160}
161
162// Notification when a sound has stopped
163void wxSound::SoundStopped(const wxSoundData* data)
164{
165 for ( wxVector<wxSoundData*>::iterator s = s_soundsPlaying.begin();
166 s != s_soundsPlaying.end(); ++s )
167 {
ce00f59b 168 if ( (*s) == data )
3b3d8b97
SC
169 {
170 s_soundsPlaying.erase(s);
171 break;
172 }
173 }
174}
175
176#endif //wxUSE_SOUND