fixing and completing iPhone sound
[wxWidgets.git] / src / osx / core / sound.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/carbon/sound.cpp
3 // Purpose: wxSound class implementation: optional
4 // Author: Ryan Norton
5 // Modified by: Stefan Csomor
6 // Created: 1998-01-01
7 // RCS-ID: $Id: sound.cpp 61475 2009-07-20 16:47:54Z VZ $
8 // Copyright: (c) Ryan Norton
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
17 #include "wx/sound.h"
18
19 #if wxOSX_USE_AUDIOTOOLBOX
20
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
31 #include "wx/osx/private.h"
32
33 #include <AudioToolbox/AudioToolbox.h>
34
35 class wxOSXAudioToolboxSoundData : public wxSoundData
36 {
37 public:
38 wxOSXAudioToolboxSoundData(const wxString& fileName);
39
40 ~wxOSXAudioToolboxSoundData();
41
42 virtual bool Play(unsigned flags);
43
44 virtual void DoStop();
45 protected:
46 static void CompletionCallback(SystemSoundID mySSID, void * soundRef);
47 void SoundCompleted();
48
49 SystemSoundID m_soundID;
50 wxString m_sndname; //file path
51 };
52
53 wxOSXAudioToolboxSoundData::wxOSXAudioToolboxSoundData(const wxString& fileName) :
54 m_soundID(NULL)
55 {
56 m_sndname = fileName;
57 }
58
59 void wxOSXAudioToolboxSoundData::CompletionCallback(SystemSoundID mySSID, void * soundRef)
60 {
61 wxOSXAudioToolboxSoundData* data = (wxOSXAudioToolboxSoundData*) soundRef;
62
63 data->SoundCompleted();
64 }
65
66 void wxOSXAudioToolboxSoundData::SoundCompleted()
67 {
68 if ( m_flags & wxSOUND_ASYNC )
69 {
70 if (m_flags & wxSOUND_LOOP)
71 AudioServicesPlaySystemSound(m_soundID);
72 else
73 Stop();
74 }
75 else
76 {
77 Stop();
78 CFRunLoopStop(CFRunLoopGetCurrent());
79 }
80
81 }
82
83 void wxOSXAudioToolboxSoundData::DoStop()
84 {
85 if (m_soundID)
86 {
87 AudioServicesDisposeSystemSoundID (m_soundID);
88 m_soundID = NULL;
89
90 wxSound::SoundStopped(this);
91 }
92 }
93
94 bool wxOSXAudioToolboxSoundData::Play(unsigned flags)
95 {
96 Stop();
97
98 m_flags = flags;
99
100 wxCFRef<CFMutableStringRef> cfMutableString(CFStringCreateMutableCopy(NULL, 0, wxCFStringRef(m_sndname)));
101 CFStringNormalize(cfMutableString,kCFStringNormalizationFormD);
102 wxCFRef<CFURLRef> url(CFURLCreateWithFileSystemPath(kCFAllocatorDefault, cfMutableString , kCFURLPOSIXPathStyle, false));
103
104 AudioServicesCreateSystemSoundID(url, &m_soundID);
105 AudioServicesAddSystemSoundCompletion( m_soundID, NULL, NULL, wxOSXAudioToolboxSoundData::CompletionCallback, (void *) this );
106
107 bool sync = !(flags & wxSOUND_ASYNC);
108
109 AudioServicesPlaySystemSound(m_soundID);
110
111 if ( sync )
112 {
113 while( m_soundID )
114 {
115 CFRunLoopRun();
116 }
117 }
118
119 return true;
120 }
121
122 bool wxSound::Create(int size, const wxByte* data)
123 {
124 return false;
125 }
126
127 bool wxSound::Create(const wxString& fileName, bool isResource)
128 {
129 if ( isResource )
130 return false;
131
132
133 m_data = new wxOSXAudioToolboxSoundData(fileName);
134 return true;
135 }
136
137 #endif // wxOSX_USE_AUDIOTOOLBOX
138
139 #endif //wxUSE_SOUND