]> git.saurik.com Git - wxWidgets.git/blame - src/osx/core/sound.cpp
notify the event loop that synthesized events are on the queue, wait for them to...
[wxWidgets.git] / src / osx / core / sound.cpp
CommitLineData
3b3d8b97 1/////////////////////////////////////////////////////////////////////////////
134865f8
SC
2// Name: src/osx/core/sound.cpp
3// Purpose: wxSound class implementation using AudioToolbox
4// Author: Stefan Csomor
3b3d8b97 5// Modified by: Stefan Csomor
134865f8 6// Created: 2009-01-01
b5b208a1 7// RCS-ID: $Id$
134865f8 8// Copyright: (c) Stefan Csomor
3b3d8b97
SC
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
14
15#if wxUSE_SOUND
16
3b3d8b97
SC
17#include "wx/sound.h"
18
0770c0a0
SC
19#if wxOSX_USE_AUDIOTOOLBOX
20
3b3d8b97
SC
21#ifndef WX_PRECOMP
22 #include "wx/object.h"
23 #include "wx/string.h"
24 #include "wx/intl.h"
25 #include "wx/log.h"
26 #include "wx/timer.h"
27#endif
28
29#include "wx/file.h"
30
0770c0a0
SC
31#include "wx/osx/private.h"
32
33#include <AudioToolbox/AudioToolbox.h>
34
3b3d8b97
SC
35class wxOSXAudioToolboxSoundData : public wxSoundData
36{
37public:
38 wxOSXAudioToolboxSoundData(const wxString& fileName);
39
40 ~wxOSXAudioToolboxSoundData();
ce00f59b 41
3b3d8b97
SC
42 virtual bool Play(unsigned flags);
43
44 virtual void DoStop();
45protected:
46 static void CompletionCallback(SystemSoundID mySSID, void * soundRef);
47 void SoundCompleted();
ce00f59b
VZ
48
49 SystemSoundID m_soundID;
3b3d8b97
SC
50 wxString m_sndname; //file path
51};
52
53wxOSXAudioToolboxSoundData::wxOSXAudioToolboxSoundData(const wxString& fileName) :
54 m_soundID(NULL)
ce00f59b 55{
3b3d8b97
SC
56 m_sndname = fileName;
57}
58
02ca710b
SC
59wxOSXAudioToolboxSoundData::~wxOSXAudioToolboxSoundData()
60{
61 DoStop();
62}
63
9a78f785
VZ
64void
65wxOSXAudioToolboxSoundData::CompletionCallback(SystemSoundID WXUNUSED(mySSID),
66 void * soundRef)
3b3d8b97
SC
67{
68 wxOSXAudioToolboxSoundData* data = (wxOSXAudioToolboxSoundData*) soundRef;
ce00f59b 69
3b3d8b97 70 data->SoundCompleted();
ce00f59b 71
509da835
KO
72 if (data->IsMarkedForDeletion())
73 delete data;
3b3d8b97
SC
74}
75
76void wxOSXAudioToolboxSoundData::SoundCompleted()
77{
78 if ( m_flags & wxSOUND_ASYNC )
79 {
80 if (m_flags & wxSOUND_LOOP)
81 AudioServicesPlaySystemSound(m_soundID);
ce00f59b 82 else
3b3d8b97
SC
83 Stop();
84 }
ce00f59b 85 else
3b3d8b97
SC
86 {
87 Stop();
88 CFRunLoopStop(CFRunLoopGetCurrent());
89 }
90
91}
92
93void wxOSXAudioToolboxSoundData::DoStop()
94{
95 if (m_soundID)
96 {
97 AudioServicesDisposeSystemSoundID (m_soundID);
98 m_soundID = NULL;
ce00f59b 99
3b3d8b97
SC
100 wxSound::SoundStopped(this);
101 }
102}
103
0770c0a0 104bool wxOSXAudioToolboxSoundData::Play(unsigned flags)
3b3d8b97
SC
105{
106 Stop();
107
108 m_flags = flags;
ce00f59b 109
3b3d8b97
SC
110 wxCFRef<CFMutableStringRef> cfMutableString(CFStringCreateMutableCopy(NULL, 0, wxCFStringRef(m_sndname)));
111 CFStringNormalize(cfMutableString,kCFStringNormalizationFormD);
112 wxCFRef<CFURLRef> url(CFURLCreateWithFileSystemPath(kCFAllocatorDefault, cfMutableString , kCFURLPOSIXPathStyle, false));
113
114 AudioServicesCreateSystemSoundID(url, &m_soundID);
134865f8 115 AudioServicesAddSystemSoundCompletion( m_soundID, CFRunLoopGetCurrent(), NULL, wxOSXAudioToolboxSoundData::CompletionCallback, (void *) this );
3b3d8b97
SC
116
117 bool sync = !(flags & wxSOUND_ASYNC);
118
119 AudioServicesPlaySystemSound(m_soundID);
120
121 if ( sync )
122 {
ce00f59b 123 while( m_soundID )
3b3d8b97
SC
124 {
125 CFRunLoopRun();
126 }
127 }
ce00f59b 128
3b3d8b97
SC
129 return true;
130}
131
c559c4b3 132bool wxSound::Create(size_t WXUNUSED(size), const void* WXUNUSED(data))
0770c0a0 133{
9a78f785
VZ
134 wxFAIL_MSG( "not implemented" );
135
0770c0a0
SC
136 return false;
137}
138
139bool wxSound::Create(const wxString& fileName, bool isResource)
140{
9a78f785 141 wxCHECK_MSG( !isResource, false, "not implemented" );
ce00f59b 142
0770c0a0
SC
143 m_data = new wxOSXAudioToolboxSoundData(fileName);
144 return true;
145}
146
3b3d8b97
SC
147#endif // wxOSX_USE_AUDIOTOOLBOX
148
149#endif //wxUSE_SOUND