2004-10-07 20:47:47 -04:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
2011-03-19 20:14:35 -04:00
|
|
|
// Name: wx/cocoa/sound.h
|
2004-10-07 20:47:47 -04:00
|
|
|
// Purpose: wxSound class (loads and plays short Windows .wav files).
|
|
|
|
// Optional on non-Windows platforms.
|
Rewrote wxSound:
* Get rid of #if wxUSE_SOUND from header. wx/sound.h checks this already.
* Get rid of pragma interface/implementation. Apple GCC dislikes them anyway.
* Allow source file to use precompiled headers (wx/wxprec.h)
* Include only needed AppKit/Foundation headers, not AppKit/AppKit.h.
* Implement simple constructors inline in header.
* Get rid of m_sndname and m_waveLength instance variables. They aren't used.
* Add copy constructor (why not).
* Move implementation of byte-array constructor into LoadWAV for consistency
with UNIX wxSound.
* LoadWAV (what was in the constructor) now properly allocs, inits, and
releases NSData. The old code for this was not valid.
* Rename lastSound to s_currentSound.
* Rename isLastSoundLooping to s_loopCurrentSound.
* Ignore the sound:didFinishPlaying: delegate message if it is received
for an NSSound other than s_currentSound.
* Create should not Stop the current sound.
* Don't use NSBundle to get a resource sound but use [NSSound soundNamed:]
which will include system sounds.
* Playing a sound synchronously uses wxEventLoop::Dispatch which will
really block (not spin the CPU like Yield). The sound is considered
finished playing when s_currentSound is set to something else. In order
to make sure we don't get stuck in this event loop the delegate
calls wxApp::WakeUpIdle if it releases s_currentSound.
* Have IsPlaying() check to make sure s_currentSound is not nil since
only messages returning another object or void are allowed to be
sent to nil objects.
Changes involving retain/release
* Get rid of comment about tricky API, it's not.
* Get rid of isLastSoundInScope. Cocoa has proper reference counting.
* Add SetNSSound which, like the rest of wxCocoa, retains/releases
appropriately, sets the delegate, and logs when WXTRACE=COCOA_RetainRelease.
* Destructor does SetNSSound(nil) which will always release the NSSound.
Create and LoadWAV use SetNSSound method like the rest of wxCocoa.
* Make the delegate always release s_currentSound if not (or if done) looping.
DoPlay sets s_currentSound to m_cocoaNSSound after retaining it so that
the delegate can always safely release it.
* Stop, like everything else, does not need check of isLastSoundInScope
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30043 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2004-10-20 17:04:52 -04:00
|
|
|
// Authors: David Elliott, Ryan Norton
|
2009-08-21 06:41:26 -04:00
|
|
|
// Modified by:
|
2004-10-07 20:47:47 -04:00
|
|
|
// Created: 2004-10-02
|
|
|
|
// RCS-ID: $Id$
|
Rewrote wxSound:
* Get rid of #if wxUSE_SOUND from header. wx/sound.h checks this already.
* Get rid of pragma interface/implementation. Apple GCC dislikes them anyway.
* Allow source file to use precompiled headers (wx/wxprec.h)
* Include only needed AppKit/Foundation headers, not AppKit/AppKit.h.
* Implement simple constructors inline in header.
* Get rid of m_sndname and m_waveLength instance variables. They aren't used.
* Add copy constructor (why not).
* Move implementation of byte-array constructor into LoadWAV for consistency
with UNIX wxSound.
* LoadWAV (what was in the constructor) now properly allocs, inits, and
releases NSData. The old code for this was not valid.
* Rename lastSound to s_currentSound.
* Rename isLastSoundLooping to s_loopCurrentSound.
* Ignore the sound:didFinishPlaying: delegate message if it is received
for an NSSound other than s_currentSound.
* Create should not Stop the current sound.
* Don't use NSBundle to get a resource sound but use [NSSound soundNamed:]
which will include system sounds.
* Playing a sound synchronously uses wxEventLoop::Dispatch which will
really block (not spin the CPU like Yield). The sound is considered
finished playing when s_currentSound is set to something else. In order
to make sure we don't get stuck in this event loop the delegate
calls wxApp::WakeUpIdle if it releases s_currentSound.
* Have IsPlaying() check to make sure s_currentSound is not nil since
only messages returning another object or void are allowed to be
sent to nil objects.
Changes involving retain/release
* Get rid of comment about tricky API, it's not.
* Get rid of isLastSoundInScope. Cocoa has proper reference counting.
* Add SetNSSound which, like the rest of wxCocoa, retains/releases
appropriately, sets the delegate, and logs when WXTRACE=COCOA_RetainRelease.
* Destructor does SetNSSound(nil) which will always release the NSSound.
Create and LoadWAV use SetNSSound method like the rest of wxCocoa.
* Make the delegate always release s_currentSound if not (or if done) looping.
DoPlay sets s_currentSound to m_cocoaNSSound after retaining it so that
the delegate can always safely release it.
* Stop, like everything else, does not need check of isLastSoundInScope
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30043 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2004-10-20 17:04:52 -04:00
|
|
|
// Copyright: (c) 2004 David Elliott, Ryan Norton
|
2004-10-07 20:47:47 -04:00
|
|
|
// Licence: wxWindows licence
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
2004-10-07 04:53:48 -04:00
|
|
|
|
2004-10-07 20:47:47 -04:00
|
|
|
#ifndef _WX_COCOA_SOUND_H_
|
|
|
|
#define _WX_COCOA_SOUND_H_
|
|
|
|
|
|
|
|
#include "wx/object.h"
|
2004-10-18 18:12:57 -04:00
|
|
|
#include "wx/cocoa/ObjcRef.h"
|
2004-10-07 20:47:47 -04:00
|
|
|
|
2007-12-11 20:35:53 -05:00
|
|
|
class WXDLLIMPEXP_ADV wxSound : public wxSoundBase
|
2004-10-07 20:47:47 -04:00
|
|
|
{
|
|
|
|
public:
|
Rewrote wxSound:
* Get rid of #if wxUSE_SOUND from header. wx/sound.h checks this already.
* Get rid of pragma interface/implementation. Apple GCC dislikes them anyway.
* Allow source file to use precompiled headers (wx/wxprec.h)
* Include only needed AppKit/Foundation headers, not AppKit/AppKit.h.
* Implement simple constructors inline in header.
* Get rid of m_sndname and m_waveLength instance variables. They aren't used.
* Add copy constructor (why not).
* Move implementation of byte-array constructor into LoadWAV for consistency
with UNIX wxSound.
* LoadWAV (what was in the constructor) now properly allocs, inits, and
releases NSData. The old code for this was not valid.
* Rename lastSound to s_currentSound.
* Rename isLastSoundLooping to s_loopCurrentSound.
* Ignore the sound:didFinishPlaying: delegate message if it is received
for an NSSound other than s_currentSound.
* Create should not Stop the current sound.
* Don't use NSBundle to get a resource sound but use [NSSound soundNamed:]
which will include system sounds.
* Playing a sound synchronously uses wxEventLoop::Dispatch which will
really block (not spin the CPU like Yield). The sound is considered
finished playing when s_currentSound is set to something else. In order
to make sure we don't get stuck in this event loop the delegate
calls wxApp::WakeUpIdle if it releases s_currentSound.
* Have IsPlaying() check to make sure s_currentSound is not nil since
only messages returning another object or void are allowed to be
sent to nil objects.
Changes involving retain/release
* Get rid of comment about tricky API, it's not.
* Get rid of isLastSoundInScope. Cocoa has proper reference counting.
* Add SetNSSound which, like the rest of wxCocoa, retains/releases
appropriately, sets the delegate, and logs when WXTRACE=COCOA_RetainRelease.
* Destructor does SetNSSound(nil) which will always release the NSSound.
Create and LoadWAV use SetNSSound method like the rest of wxCocoa.
* Make the delegate always release s_currentSound if not (or if done) looping.
DoPlay sets s_currentSound to m_cocoaNSSound after retaining it so that
the delegate can always safely release it.
* Stop, like everything else, does not need check of isLastSoundInScope
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30043 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2004-10-20 17:04:52 -04:00
|
|
|
wxSound()
|
|
|
|
: m_cocoaNSSound(NULL)
|
|
|
|
{}
|
|
|
|
wxSound(const wxString& fileName, bool isResource = false)
|
|
|
|
: m_cocoaNSSound(NULL)
|
|
|
|
{ Create(fileName, isResource); }
|
|
|
|
wxSound(int size, const wxByte* data)
|
|
|
|
: m_cocoaNSSound(NULL)
|
|
|
|
{ LoadWAV(data,size,true); }
|
|
|
|
wxSound(const wxSound& sound); // why not?
|
2006-09-05 16:47:48 -04:00
|
|
|
virtual ~wxSound();
|
2004-10-07 20:47:47 -04:00
|
|
|
|
|
|
|
public:
|
2004-10-18 17:41:34 -04:00
|
|
|
bool Create(const wxString& fileName, bool isResource = false);
|
2004-10-18 18:12:57 -04:00
|
|
|
bool IsOk() const
|
|
|
|
{ return m_cocoaNSSound; }
|
2004-10-18 17:41:34 -04:00
|
|
|
static void Stop();
|
|
|
|
static bool IsPlaying();
|
2004-10-07 20:47:47 -04:00
|
|
|
|
Rewrote wxSound:
* Get rid of #if wxUSE_SOUND from header. wx/sound.h checks this already.
* Get rid of pragma interface/implementation. Apple GCC dislikes them anyway.
* Allow source file to use precompiled headers (wx/wxprec.h)
* Include only needed AppKit/Foundation headers, not AppKit/AppKit.h.
* Implement simple constructors inline in header.
* Get rid of m_sndname and m_waveLength instance variables. They aren't used.
* Add copy constructor (why not).
* Move implementation of byte-array constructor into LoadWAV for consistency
with UNIX wxSound.
* LoadWAV (what was in the constructor) now properly allocs, inits, and
releases NSData. The old code for this was not valid.
* Rename lastSound to s_currentSound.
* Rename isLastSoundLooping to s_loopCurrentSound.
* Ignore the sound:didFinishPlaying: delegate message if it is received
for an NSSound other than s_currentSound.
* Create should not Stop the current sound.
* Don't use NSBundle to get a resource sound but use [NSSound soundNamed:]
which will include system sounds.
* Playing a sound synchronously uses wxEventLoop::Dispatch which will
really block (not spin the CPU like Yield). The sound is considered
finished playing when s_currentSound is set to something else. In order
to make sure we don't get stuck in this event loop the delegate
calls wxApp::WakeUpIdle if it releases s_currentSound.
* Have IsPlaying() check to make sure s_currentSound is not nil since
only messages returning another object or void are allowed to be
sent to nil objects.
Changes involving retain/release
* Get rid of comment about tricky API, it's not.
* Get rid of isLastSoundInScope. Cocoa has proper reference counting.
* Add SetNSSound which, like the rest of wxCocoa, retains/releases
appropriately, sets the delegate, and logs when WXTRACE=COCOA_RetainRelease.
* Destructor does SetNSSound(nil) which will always release the NSSound.
Create and LoadWAV use SetNSSound method like the rest of wxCocoa.
* Make the delegate always release s_currentSound if not (or if done) looping.
DoPlay sets s_currentSound to m_cocoaNSSound after retaining it so that
the delegate can always safely release it.
* Stop, like everything else, does not need check of isLastSoundInScope
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30043 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2004-10-20 17:04:52 -04:00
|
|
|
void SetNSSound(WX_NSSound cocoaNSSound);
|
2004-10-18 17:41:34 -04:00
|
|
|
inline WX_NSSound GetNSSound()
|
2004-10-18 18:12:57 -04:00
|
|
|
{ return m_cocoaNSSound; }
|
2009-08-21 06:41:26 -04:00
|
|
|
protected:
|
2004-10-18 17:41:34 -04:00
|
|
|
bool DoPlay(unsigned flags) const;
|
Rewrote wxSound:
* Get rid of #if wxUSE_SOUND from header. wx/sound.h checks this already.
* Get rid of pragma interface/implementation. Apple GCC dislikes them anyway.
* Allow source file to use precompiled headers (wx/wxprec.h)
* Include only needed AppKit/Foundation headers, not AppKit/AppKit.h.
* Implement simple constructors inline in header.
* Get rid of m_sndname and m_waveLength instance variables. They aren't used.
* Add copy constructor (why not).
* Move implementation of byte-array constructor into LoadWAV for consistency
with UNIX wxSound.
* LoadWAV (what was in the constructor) now properly allocs, inits, and
releases NSData. The old code for this was not valid.
* Rename lastSound to s_currentSound.
* Rename isLastSoundLooping to s_loopCurrentSound.
* Ignore the sound:didFinishPlaying: delegate message if it is received
for an NSSound other than s_currentSound.
* Create should not Stop the current sound.
* Don't use NSBundle to get a resource sound but use [NSSound soundNamed:]
which will include system sounds.
* Playing a sound synchronously uses wxEventLoop::Dispatch which will
really block (not spin the CPU like Yield). The sound is considered
finished playing when s_currentSound is set to something else. In order
to make sure we don't get stuck in this event loop the delegate
calls wxApp::WakeUpIdle if it releases s_currentSound.
* Have IsPlaying() check to make sure s_currentSound is not nil since
only messages returning another object or void are allowed to be
sent to nil objects.
Changes involving retain/release
* Get rid of comment about tricky API, it's not.
* Get rid of isLastSoundInScope. Cocoa has proper reference counting.
* Add SetNSSound which, like the rest of wxCocoa, retains/releases
appropriately, sets the delegate, and logs when WXTRACE=COCOA_RetainRelease.
* Destructor does SetNSSound(nil) which will always release the NSSound.
Create and LoadWAV use SetNSSound method like the rest of wxCocoa.
* Make the delegate always release s_currentSound if not (or if done) looping.
DoPlay sets s_currentSound to m_cocoaNSSound after retaining it so that
the delegate can always safely release it.
* Stop, like everything else, does not need check of isLastSoundInScope
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30043 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2004-10-20 17:04:52 -04:00
|
|
|
bool LoadWAV(const wxUint8 *data, size_t length, bool copyData);
|
2004-10-07 20:47:47 -04:00
|
|
|
private:
|
Rewrote wxSound:
* Get rid of #if wxUSE_SOUND from header. wx/sound.h checks this already.
* Get rid of pragma interface/implementation. Apple GCC dislikes them anyway.
* Allow source file to use precompiled headers (wx/wxprec.h)
* Include only needed AppKit/Foundation headers, not AppKit/AppKit.h.
* Implement simple constructors inline in header.
* Get rid of m_sndname and m_waveLength instance variables. They aren't used.
* Add copy constructor (why not).
* Move implementation of byte-array constructor into LoadWAV for consistency
with UNIX wxSound.
* LoadWAV (what was in the constructor) now properly allocs, inits, and
releases NSData. The old code for this was not valid.
* Rename lastSound to s_currentSound.
* Rename isLastSoundLooping to s_loopCurrentSound.
* Ignore the sound:didFinishPlaying: delegate message if it is received
for an NSSound other than s_currentSound.
* Create should not Stop the current sound.
* Don't use NSBundle to get a resource sound but use [NSSound soundNamed:]
which will include system sounds.
* Playing a sound synchronously uses wxEventLoop::Dispatch which will
really block (not spin the CPU like Yield). The sound is considered
finished playing when s_currentSound is set to something else. In order
to make sure we don't get stuck in this event loop the delegate
calls wxApp::WakeUpIdle if it releases s_currentSound.
* Have IsPlaying() check to make sure s_currentSound is not nil since
only messages returning another object or void are allowed to be
sent to nil objects.
Changes involving retain/release
* Get rid of comment about tricky API, it's not.
* Get rid of isLastSoundInScope. Cocoa has proper reference counting.
* Add SetNSSound which, like the rest of wxCocoa, retains/releases
appropriately, sets the delegate, and logs when WXTRACE=COCOA_RetainRelease.
* Destructor does SetNSSound(nil) which will always release the NSSound.
Create and LoadWAV use SetNSSound method like the rest of wxCocoa.
* Make the delegate always release s_currentSound if not (or if done) looping.
DoPlay sets s_currentSound to m_cocoaNSSound after retaining it so that
the delegate can always safely release it.
* Stop, like everything else, does not need check of isLastSoundInScope
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30043 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2004-10-20 17:04:52 -04:00
|
|
|
WX_NSSound m_cocoaNSSound;
|
2004-10-18 18:12:57 -04:00
|
|
|
static const wxObjcAutoRefFromAlloc<struct objc_object *> sm_cocoaDelegate;
|
2004-10-07 20:47:47 -04:00
|
|
|
};
|
|
|
|
|
Rewrote wxSound:
* Get rid of #if wxUSE_SOUND from header. wx/sound.h checks this already.
* Get rid of pragma interface/implementation. Apple GCC dislikes them anyway.
* Allow source file to use precompiled headers (wx/wxprec.h)
* Include only needed AppKit/Foundation headers, not AppKit/AppKit.h.
* Implement simple constructors inline in header.
* Get rid of m_sndname and m_waveLength instance variables. They aren't used.
* Add copy constructor (why not).
* Move implementation of byte-array constructor into LoadWAV for consistency
with UNIX wxSound.
* LoadWAV (what was in the constructor) now properly allocs, inits, and
releases NSData. The old code for this was not valid.
* Rename lastSound to s_currentSound.
* Rename isLastSoundLooping to s_loopCurrentSound.
* Ignore the sound:didFinishPlaying: delegate message if it is received
for an NSSound other than s_currentSound.
* Create should not Stop the current sound.
* Don't use NSBundle to get a resource sound but use [NSSound soundNamed:]
which will include system sounds.
* Playing a sound synchronously uses wxEventLoop::Dispatch which will
really block (not spin the CPU like Yield). The sound is considered
finished playing when s_currentSound is set to something else. In order
to make sure we don't get stuck in this event loop the delegate
calls wxApp::WakeUpIdle if it releases s_currentSound.
* Have IsPlaying() check to make sure s_currentSound is not nil since
only messages returning another object or void are allowed to be
sent to nil objects.
Changes involving retain/release
* Get rid of comment about tricky API, it's not.
* Get rid of isLastSoundInScope. Cocoa has proper reference counting.
* Add SetNSSound which, like the rest of wxCocoa, retains/releases
appropriately, sets the delegate, and logs when WXTRACE=COCOA_RetainRelease.
* Destructor does SetNSSound(nil) which will always release the NSSound.
Create and LoadWAV use SetNSSound method like the rest of wxCocoa.
* Make the delegate always release s_currentSound if not (or if done) looping.
DoPlay sets s_currentSound to m_cocoaNSSound after retaining it so that
the delegate can always safely release it.
* Stop, like everything else, does not need check of isLastSoundInScope
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30043 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2004-10-20 17:04:52 -04:00
|
|
|
#endif //ndef _WX_COCOA_SOUND_H_
|