sound implementation for AudioToolbox on 10.5 and iPhone
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61909 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
120
src/osx/core/sound.cpp
Normal file
120
src/osx/core/sound.cpp
Normal file
@@ -0,0 +1,120 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: src/osx/carbon/sound.cpp
|
||||
// Purpose: wxSound class implementation: optional
|
||||
// Author: Ryan Norton
|
||||
// Modified by: Stefan Csomor
|
||||
// Created: 1998-01-01
|
||||
// RCS-ID: $Id: sound.cpp 61475 2009-07-20 16:47:54Z VZ $
|
||||
// Copyright: (c) Ryan Norton
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#if wxUSE_SOUND
|
||||
|
||||
#if wxOSX_USE_AUDIOTOOLBOX
|
||||
|
||||
#include "wx/sound.h"
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/object.h"
|
||||
#include "wx/string.h"
|
||||
#include "wx/intl.h"
|
||||
#include "wx/log.h"
|
||||
#include "wx/timer.h"
|
||||
#endif
|
||||
|
||||
#include "wx/file.h"
|
||||
|
||||
class wxOSXAudioToolboxSoundData : public wxSoundData
|
||||
{
|
||||
public:
|
||||
wxOSXAudioToolboxSoundData(const wxString& fileName);
|
||||
|
||||
~wxOSXAudioToolboxSoundData();
|
||||
|
||||
virtual bool Play(unsigned flags);
|
||||
|
||||
virtual void DoStop();
|
||||
protected:
|
||||
static void CompletionCallback(SystemSoundID mySSID, void * soundRef);
|
||||
void SoundCompleted();
|
||||
|
||||
SystemSoundID m_soundID;
|
||||
wxString m_sndname; //file path
|
||||
};
|
||||
|
||||
wxOSXAudioToolboxSoundData::wxOSXAudioToolboxSoundData(const wxString& fileName) :
|
||||
m_soundID(NULL)
|
||||
{
|
||||
m_sndname = fileName;
|
||||
}
|
||||
|
||||
void wxOSXAudioToolboxSoundData::CompletionCallback(SystemSoundID mySSID, void * soundRef)
|
||||
{
|
||||
wxOSXAudioToolboxSoundData* data = (wxOSXAudioToolboxSoundData*) soundRef;
|
||||
|
||||
data->SoundCompleted();
|
||||
}
|
||||
|
||||
void wxOSXAudioToolboxSoundData::SoundCompleted()
|
||||
{
|
||||
if ( m_flags & wxSOUND_ASYNC )
|
||||
{
|
||||
if (m_flags & wxSOUND_LOOP)
|
||||
AudioServicesPlaySystemSound(m_soundID);
|
||||
else
|
||||
Stop();
|
||||
}
|
||||
else
|
||||
{
|
||||
Stop();
|
||||
CFRunLoopStop(CFRunLoopGetCurrent());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void wxOSXAudioToolboxSoundData::DoStop()
|
||||
{
|
||||
if (m_soundID)
|
||||
{
|
||||
AudioServicesDisposeSystemSoundID (m_soundID);
|
||||
m_soundID = NULL;
|
||||
|
||||
wxSound::SoundStopped(this);
|
||||
}
|
||||
}
|
||||
|
||||
bool wxOSXAudioToolboxSoundData::DoPlay(unsigned flags) const
|
||||
{
|
||||
Stop();
|
||||
|
||||
m_flags = flags;
|
||||
|
||||
wxCFRef<CFMutableStringRef> cfMutableString(CFStringCreateMutableCopy(NULL, 0, wxCFStringRef(m_sndname)));
|
||||
CFStringNormalize(cfMutableString,kCFStringNormalizationFormD);
|
||||
wxCFRef<CFURLRef> url(CFURLCreateWithFileSystemPath(kCFAllocatorDefault, cfMutableString , kCFURLPOSIXPathStyle, false));
|
||||
|
||||
AudioServicesCreateSystemSoundID(url, &m_soundID);
|
||||
AudioServicesAddSystemSoundCompletion( m_soundID, NULL, NULL, wxOSXAudioToolboxSoundData::CompletionCallback, (void *) this );
|
||||
|
||||
bool sync = !(flags & wxSOUND_ASYNC);
|
||||
|
||||
AudioServicesPlaySystemSound(m_soundID);
|
||||
|
||||
if ( sync )
|
||||
{
|
||||
while( m_soundID )
|
||||
{
|
||||
CFRunLoopRun();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif // wxOSX_USE_AUDIOTOOLBOX
|
||||
|
||||
#endif //wxUSE_SOUND
|
156
src/osx/sound_osx.cpp
Normal file
156
src/osx/sound_osx.cpp
Normal file
@@ -0,0 +1,156 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: src/osx/sound_osx.cpp
|
||||
// Purpose: wxSound class common osx code
|
||||
// Author: Stefan Csomor
|
||||
// Modified by:
|
||||
// Created: 2009-09-01
|
||||
// RCS-ID: $Id: sound.cpp 61475 2009-07-20 16:47:54Z VZ $
|
||||
// Copyright: (c) Stefan Csomor
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#if wxUSE_SOUND
|
||||
|
||||
#include "wx/sound.h"
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/object.h"
|
||||
#include "wx/string.h"
|
||||
#include "wx/intl.h"
|
||||
#include "wx/log.h"
|
||||
#include "wx/timer.h"
|
||||
#endif
|
||||
|
||||
#include "wx/file.h"
|
||||
|
||||
#include "wx/vector.h"
|
||||
|
||||
class wxSoundTimer : public wxTimer
|
||||
{
|
||||
public:
|
||||
wxSoundTimer(wxSoundData* snd)
|
||||
: m_sound(snd)
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~wxSoundTimer()
|
||||
{
|
||||
Stop();
|
||||
m_sound->DoStop();
|
||||
}
|
||||
|
||||
void Notify()
|
||||
{
|
||||
m_sound->SoundTask();
|
||||
}
|
||||
|
||||
protected:
|
||||
wxSoundData* m_sound;
|
||||
};
|
||||
|
||||
wxVector<wxSoundData*> s_soundsPlaying;
|
||||
|
||||
wxSoundData::wxSoundData()
|
||||
{
|
||||
m_pTimer = NULL;
|
||||
}
|
||||
|
||||
wxSoundData::~wxSoundData()
|
||||
{
|
||||
}
|
||||
|
||||
void wxSoundData::Stop()
|
||||
{
|
||||
DoStop();
|
||||
if ( m_pTimer )
|
||||
{
|
||||
delete m_pTimer;
|
||||
m_pTimer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
//Time between timer calls
|
||||
#define MOVIE_DELAY 100
|
||||
|
||||
void wxSoundData::SoundTask()
|
||||
{
|
||||
}
|
||||
|
||||
void wxSoundData::CreateAndStartTimer()
|
||||
{
|
||||
//Start timer and play movie asyncronously
|
||||
m_pTimer = new wxSoundTimer(this);
|
||||
m_pTimer->Start(MOVIE_DELAY, wxTIMER_CONTINUOUS);
|
||||
}
|
||||
|
||||
wxSound::wxSound()
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
wxSound::wxSound(const wxString& sFileName, bool isResource)
|
||||
{
|
||||
Init();
|
||||
Create(sFileName, isResource);
|
||||
}
|
||||
|
||||
wxSound::wxSound(int size, const wxByte* data)
|
||||
{
|
||||
Init();
|
||||
Create( size, data );
|
||||
}
|
||||
|
||||
wxSound::~wxSound()
|
||||
{
|
||||
delete m_data;
|
||||
}
|
||||
|
||||
void wxSound::Init()
|
||||
{
|
||||
m_data = NULL;
|
||||
}
|
||||
|
||||
bool wxSound::DoPlay(unsigned flags) const
|
||||
{
|
||||
if ( m_data )
|
||||
{
|
||||
s_soundsPlaying.push_back(m_data);
|
||||
if ( !m_data->Play(flags) )
|
||||
s_soundsPlaying.pop_back();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool wxSound::IsPlaying()
|
||||
{
|
||||
return s_soundsPlaying.size() > 0;
|
||||
}
|
||||
|
||||
void wxSound::Stop()
|
||||
{
|
||||
for ( wxVector<wxSoundData*>::reverse_iterator s = s_soundsPlaying.rbegin();
|
||||
s != s_soundsPlaying.rend(); ++s )
|
||||
{
|
||||
(*s)->Stop();
|
||||
}
|
||||
}
|
||||
|
||||
// Notification when a sound has stopped
|
||||
void wxSound::SoundStopped(const wxSoundData* data)
|
||||
{
|
||||
for ( wxVector<wxSoundData*>::iterator s = s_soundsPlaying.begin();
|
||||
s != s_soundsPlaying.end(); ++s )
|
||||
{
|
||||
if ( (*s) == data )
|
||||
{
|
||||
s_soundsPlaying.erase(s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif //wxUSE_SOUND
|
Reference in New Issue
Block a user