1261 lines
108 KiB
C++
1261 lines
108 KiB
C++
// ==========================================================================
|
||
// Class Specification :
|
||
// COXSoundEffectManager & COXSoundEffectOrganizer
|
||
// ==========================================================================
|
||
|
||
// Version: 9.3
|
||
|
||
// This software along with its related components, documentation and files ("The Libraries")
|
||
// is ?1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
|
||
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
|
||
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
|
||
// to obtain this file, or directly from our office. For a copy of the license governing
|
||
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
|
||
|
||
// //////////////////////////////////////////////////////////////////////////
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
|
||
/*
|
||
|
||
We introduce three classes that were designed to simplify process of creating
|
||
applications with sound effects functionality. Nowadays, more and more
|
||
computers are sold with sound card installed and sound effects can add another
|
||
professional feature that distinguish your software. Of course, sound effect is
|
||
a must for multimedia application but sometimes it's good idea to add some sounds
|
||
in usual application too. Wouldn't it be nice to hear some sound when you click
|
||
over button or play some sound when mouse moves over some object. Using our new
|
||
classes it takes only one line of code to associate a sound effect with any object
|
||
so this effect will be played when specified event is fired.
|
||
|
||
We already have in our library the class that is capable of playing sound: COXSound.
|
||
And now we move two steps further and provide for you COXSoundEffectManager,
|
||
COXSoundEffectOrganizer and COXSoundCustomizeDlg classes.
|
||
|
||
|
||
|
||
|
||
//////////////////////////////
|
||
COXSoundEffectManager
|
||
|
||
We noted that sounds are usually played in result of some user action (e.g. mouse
|
||
left button was clicked or specic keyboard button was pressed) or in result of some
|
||
event (e.g. expiring of some period of time). Any event which eventually forces
|
||
an application to play sound we call sound event. To uniquely identify any such
|
||
event we define sound event ID. This approach goes perefectly fine with natural
|
||
events such as mouse or keyboard events. In the case when sound played in result of
|
||
application specific event why don't we define it as application specific message
|
||
(anyway, windows everywhere). We arrived to the point where we associate with
|
||
any sound played some windows message.
|
||
Now the idea that stands behind COXSoundEffectManager class should be clear.
|
||
Why don't we create the class that will manage sound effects and sound events?
|
||
It could be only one function to register a sound to be played when particular
|
||
events is fired! And as long as sound events are defined as window messages we
|
||
can come up with the class that will work with any object (static, edit, combobox,
|
||
button, listbox, tree, list controls are windows, aren't they).
|
||
|
||
In our library we have very powerful class that was designed specifically to hook
|
||
any window and handle any message in any specific way. This is COXHookWnd class and
|
||
we use it as parent class of COXSoundEffectManager.
|
||
|
||
Now, everything is clear. We hook a window and trace all messages. As long as the
|
||
currently handling message is the registered as sound event one we start to play
|
||
associated sound using our COXSound class. Pretty simple.
|
||
|
||
|
||
Now let's explore how to use the functionality provided by COXSoundEffectManager
|
||
class.
|
||
|
||
First of all as long as COXSoundEffectManager is derived from COXHookWnd class
|
||
any target window must be attached to COXSoundEffectManager object using next
|
||
function:
|
||
|
||
BOOL Attach(CWnd* pWnd);
|
||
// --- In : pWnd - pointer to created window to be hooked
|
||
// --- Returns: TRUE if pWnd was successfully hooked, otherwise FALSE
|
||
// --- Effect : Hooks window
|
||
|
||
After window was successfully attached you can register whatever sound events
|
||
and any sound to be played when corresponding event is fired. Use next functions
|
||
to do that:
|
||
|
||
BOOL RegisterPlayEvent(UINT nMsgIDtoStartPlaying, LPCTSTR pszFileName,
|
||
BOOL bLoop=FALSE, int nLoopCount=-1, BOOL bForceToStart=TRUE);
|
||
BOOL RegisterPlayEvent(UINT nMsgIDtoStartPlaying, UINT nSoundResource,
|
||
HINSTANCE hResInstance = AfxGetResourceHandle(),
|
||
BOOL bLoop=FALSE, int nLoopCount=-1, BOOL bForceToStart=TRUE);
|
||
BOOL RegisterPlayEvent(UINT nMsgIDtoStartPlaying, CFile* pOpenedFile,
|
||
BOOL bLoop=FALSE, int nLoopCount=-1, BOOL bForceToStart=TRUE);
|
||
// --- In : nMsgIDtoStartPlaying - message ID to start playing sound
|
||
// pszFileName - complete path and filename for a
|
||
// WAVE file to open
|
||
// nSoundResource - resourse ID to load WAVE
|
||
// hResInstance - handle to the application that contains
|
||
// specified resourse
|
||
// pOpenedFile - pointer to CFile object from which to
|
||
// read WAVE data
|
||
// bLoop - if TRUE then specified sound will be
|
||
// played in loop, otherwise the specified
|
||
// sound will be played only once
|
||
// nLoopCount - if bLoop is TRUE then this parameter
|
||
// specifies the number of times it will
|
||
// be played (note that if you specify 0 the
|
||
// sound will be played once anyway). If you
|
||
// set it to -1 the specified sound will be
|
||
// played infinitely.
|
||
// bForceToStart - if TRUE then if nMsgIDtoStartPlaying
|
||
// message was fired then any sound effect
|
||
// that is playing at the moment will be
|
||
// stoped and the specified sound effect
|
||
// will be played, otherwise if
|
||
// nMsgIDtoStartPlaying message was fired
|
||
// and if any sound effect is playing at
|
||
// the moment then the specified sound
|
||
// effect won't be played
|
||
//
|
||
// --- Returns: TRUE if sound was registereded successfully to be played if
|
||
// nMsgIDtoStartPlaying is fired or FALSE otherwise
|
||
// --- Effect : Register sound effect
|
||
|
||
|
||
As you can see you can use as source of sound an existing sound file or resource
|
||
from your application and you can set additional options that define the way sound
|
||
is played: sound can be played only once or in loop infinetely or for concrete times.
|
||
Also you can specify if sound should be started playing even though another can be
|
||
played at the same moment.
|
||
|
||
Some sound can be pretty lengthy (especially if you used loop infinitely option).
|
||
Although any playing sound will be stopped when hooked window is destroyed or detached
|
||
using Detach function sometimes it's good idea to define some events that would mean
|
||
after been fired that any playing sound should be stoped. We call such events as
|
||
sound stop events (so the sound events that were described before we call sound play
|
||
event). To register such event use next function:
|
||
|
||
BOOL RegisterStopEvent(UINT nMsgIDtoStopPlaying);
|
||
// --- In : nMsgIDtoStopPlaying - message ID to stop playing sound
|
||
// --- Out :
|
||
// --- Returns: TRUE if the specified event was registereded successfully
|
||
// or FALSE otherwise
|
||
// --- Effect : Register stop event which whould stop playing any effect
|
||
// if have been fired
|
||
|
||
Of course the same event cannot be registered to play different sounds and
|
||
cannot be registered as play and stop event simultenuosely.
|
||
|
||
Any stop or play sound events can be unregistered using next functions:
|
||
|
||
BOOL UnregisterPlayEvent(UINT nMsgIDtoStartPlaying);
|
||
// --- In : nMsgIDtoStartPlaying - registered message ID to start playing
|
||
// sound
|
||
// --- Returns: TRUE if sound was unregistereded successfully or FALSE otherwise
|
||
// --- Effect : Unregister sound effect
|
||
|
||
BOOL UnregisterStopEvent(UINT nMsgIDtoStopPlaying);
|
||
// --- In : nMsgIDtoStopPlaying - registered message ID to stop playing
|
||
// any sound
|
||
// --- Returns: TRUE if stop event was unregistereded successfully or FALSE otherwise
|
||
// --- Effect : Unregister stop event
|
||
|
||
If you would like to unregister all events altogether then you will find next
|
||
functions very helpful:
|
||
|
||
void UnregisterAllEffects();
|
||
// --- Effect : Unregister all registered start and stop playing events
|
||
|
||
void UnregisterAllPlayEvents();
|
||
// --- Effect : Unregister all registered start playing events
|
||
|
||
void UnregisterAllStopEvents();
|
||
// --- Effect : Unregister all registered stop playing events
|
||
|
||
|
||
At any moment you can request whether particular event is registered as stop or play
|
||
sound event using next functions:
|
||
|
||
BOOL IsRegisteredPlayEvent(UINT nMsgIDtoStartPlaying);
|
||
// --- In : nMsgIDtoStartPlaying - test message ID to start playing sound
|
||
// --- Returns: TRUE if specified event was registereded as the one to start
|
||
// playing sound or FALSE otherwise
|
||
|
||
BOOL IsRegisteredStopEvent(UINT nMsgIDtoStopPlaying);
|
||
// --- In : nMsgIDtoStopPlaying - test message ID to stop playing sound
|
||
// --- Returns: TRUE if specified event was registereded as the one to stop
|
||
// playing sound or FALSE otherwise
|
||
|
||
|
||
There is set of functions that you will hardly use but that are very helpful while
|
||
navigating through all registered sound events. They are pretty explanatory
|
||
themselves and here is the list of them:
|
||
|
||
POSITION GetFirstPlayEvent()
|
||
// --- Returns: A POSITION value that indicates a starting position for iterating
|
||
// the play events; or NULL if there is no registered play event.
|
||
// --- Effect : Starts a play events iteration by returning a POSITION value that
|
||
// can be passed to a GetNextPlayEvent call. The iteration sequence is
|
||
// not predictable; therefore, the "first play event" has no special
|
||
// significance.
|
||
|
||
UINT GetNextPlayEvent(POSITION& rNextPosition);
|
||
// --- In : rNextPosition - Specifies a reference to a POSITION value
|
||
// returned by a previous GetNextPlayEvent or
|
||
// GetFirstPlayEvent call.
|
||
// --- Returns: message ID that is registered to start playing sound
|
||
// --- Effect : Retrieves the message ID of a play event at rNextPosition, then
|
||
// updates rNextPosition to refer to the next play event. This function
|
||
// is most useful for iterating through all the play events.
|
||
// If the retrieved element is the last play event, then the new value
|
||
// of rNextPosition is set to NULL.
|
||
|
||
POSITION GetFirstStopEvent()
|
||
// --- Returns: A POSITION value that indicates a starting position for iterating
|
||
// the stop events; or NULL if there is no registered stop event.
|
||
// --- Effect : Starts a stop events iteration by returning a POSITION value that
|
||
// can be passed to a GetNextStopEvent call. The iteration sequence is
|
||
// not predictable; therefore, the "first stop event" has no special
|
||
// significance.
|
||
|
||
UINT GetNextStopEvent(POSITION& rNextPosition);
|
||
// --- In : rNextPosition - Specifies a reference to a POSITION value
|
||
// returned by a previous GetNextStopEvent or
|
||
// GetFirstStopEvent call.
|
||
// --- Returns: message ID that is registered to stop any playing sound
|
||
// --- Effect : Retrieves the message ID of a stop event at rNextPosition, then
|
||
// updates rNextPosition to refer to the next stop event. This function
|
||
// is most useful for iterating through all the stop events.
|
||
// If the retrieved element is the last play event, then the new value
|
||
// of rNextPosition is set to NULL.
|
||
|
||
|
||
|
||
While programming using COXSoundEffectManager class to full extent you can find next
|
||
function of big help:
|
||
|
||
LPSOUNDEFFECT GetSoundEffect(UINT nMsgIDtoStartPlaying);
|
||
// --- In : nMsgIDtoStartPlaying - registered message ID to start playing
|
||
// sound
|
||
// --- Returns: pointer to SOUNDEFFECT structure if successful, or NULL otherwise.
|
||
// SOUNDEFFECT structure is designed specifically to describe any
|
||
// registered sound effect and used internally in the class.
|
||
// It is declared as follows:
|
||
//
|
||
// typedef struct _tagSOUNDEFFECT
|
||
// {
|
||
// // pointer to opened COXSound object
|
||
// COXSound *pSound;
|
||
// // if TRUE then sound will be played in loop, otherwise it
|
||
// // will be played only once
|
||
// BOOL bLoop;
|
||
// // if bLoop is TRUE then if it equals -1 then sound will be
|
||
// // looped infinitely, otherwise it defines the number of
|
||
// // times it will be looped. The value of zero means that
|
||
// // sound will be still played once.
|
||
// int nLoopCount;
|
||
// // if TRUE then the sound will be started to play even though
|
||
// // another sound is played at the same moment, otherwise if
|
||
// // any sound was playing at the moment when the associated
|
||
// // sound event was fired then the sound won't be played.
|
||
// BOOL bForceToStart;
|
||
//
|
||
// . . . . . . . . . . . . . . . . . . . . .
|
||
//
|
||
// }
|
||
//
|
||
|
||
|
||
BOOL StopPlaying();
|
||
// --- Returns: TRUE if successful or FALSE otherwise
|
||
// --- Effect : Stops playing any registered sound effect
|
||
BOOL IsPlaying();
|
||
// --- Returns: TRUE if any registered sound effect is being played
|
||
// or FALSE otherwise
|
||
|
||
As you can see you can determine at any moment if any sound effect is playing and
|
||
stop playing any sound programmatically without sending any registered stop event.
|
||
And at any moment you can request info about any registered sound effect.
|
||
|
||
As we mentioned above all these are functions rarely used due to the fact that they
|
||
operate on internal COXSoundEffectManager data and only defined as public ones in
|
||
order to give a sophisticated application a way to control sound events and effects
|
||
at the very low level.
|
||
|
||
But next two functions can be of great value. Every people have their own preferences.
|
||
One sound can be good for one person while unbearable for the other. Choosing the
|
||
right sound can be a nightmare for a programmer. Another problem can be with sequences
|
||
of defined sound events (someone might prefer to hear as less sounds as possible and
|
||
someone else could be a meloman, you never know). So we decided to provide the
|
||
functionality of saving in registry all registered play and stop sound events and
|
||
sound effects. Next two functions are defined:
|
||
|
||
BOOL SaveState(LPCTSTR lpszProfileName);
|
||
// --- In : lpszProfileName - name of hive in registry where
|
||
// all information about COXSoundEffectManager
|
||
// will be saved.
|
||
// --- Returns: TRUE if succeeds, or FALSE otherwise.
|
||
// --- Effect : Saves COXSoundEffectManager registered start and stop playing
|
||
// effects into registry
|
||
BOOL LoadState(LPCTSTR lpszProfileName);
|
||
// --- In : lpszProfileName - name of hive in registry where
|
||
// all information about COXSoundEffectManager
|
||
// was saved.
|
||
// --- Out :
|
||
// --- Returns: TRUE if succeeds, or FALSE otherwise.
|
||
// --- Effect : Loads COXSoundEffectManager start and stop playing effects from
|
||
// registry file
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
IMPORTANT !!!
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
If you don't need to save state of Sound Effect Manager settings into
|
||
registry then you probably wouldn't like to include source code for
|
||
COXRegistryValFile class into your project (that is a must if you
|
||
call COXSoundEffectManager::SaveState() and/or COXSoundEffectManager::LoadState()).
|
||
If this is a case then you have to include in you stdafx.h file next code:
|
||
|
||
#define OXSE_NO_SAVESTATE
|
||
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
|
||
We described all functionality you've got as a programmer using COXSoundEffectManager
|
||
class. But from our point of view this class has two weak sides. First of all, it is
|
||
designed to handle only one target window at the moment. That means if you want
|
||
to assign sound effects to five buttons then you have to create five
|
||
COXSoundEffectManager objects which adds a lot of weight to your source code.
|
||
To resolve this problem we created COXSoundEffectOrganizer class which can be used
|
||
to register sound effects for multiple windows. Of course internally this class
|
||
creates COXSoundEffectManager object for every registered window but hides this fact
|
||
from a programmer while providing the same functionality as COXSoundEffectManager
|
||
does. Plus COXSoundEffectOrganizer is aware about all COXSoundEffectManager objects
|
||
it manages and can stop and start playing sound in any of them (that is why
|
||
COXSoundEffectManager constructor is designed to take pointer to
|
||
COXSoundEffectOrganizer object as parameter which must be set to NULL if
|
||
COXSoundEffectManager object is used as stand-alone).
|
||
|
||
!!! It is higly recommended to use COXSoundEffectOrganizer instead of
|
||
COXSoundEffectManager even in situation when you provide sound effects
|
||
only for one window !!!
|
||
|
||
Another problem has to do with customizing of sound effects. Although we
|
||
provide basic functions to save into and load from registry state of any
|
||
COXSoundEffectManager object, there is still a problem to provide an easy way to
|
||
users to customize sound effects so they can do that automatically. In order to
|
||
resolve that problem we designed COXSoundCustomizeDlg class which takes pointer
|
||
to COXSoundEffectOrganizer object and provides user interface to add, delete and
|
||
edit any sound events and effects for all windows registered with given
|
||
COXSoundEffectOrganizer object (another reason to use always COXSoundEffectOrganizer
|
||
instead of COXSoundEffectManager).
|
||
|
||
Refer to the documentation on both classes for more details.
|
||
|
||
|
||
|
||
|
||
/////////////////////////////
|
||
COXSoundEffectOrganizer
|
||
|
||
COXSoundEffectManager class provides all the functionality we need to associate any
|
||
sound events with one window object. It's not very convinient when you have to
|
||
provide sound effects for big number of window objects (you have to create
|
||
COXSoundEffectManager object for every such window object). And still you have a
|
||
problem with organizing all these COXSoundEffectManager objects. To simplify
|
||
the process of using multiple instances of COXSoundEffectManager object and
|
||
manage them in the most effective way we designed COXSoundEffectOrganizer class.
|
||
|
||
We duplicated most functions that can be found in COXSoundEffectManager class
|
||
just by adding an additional parameter - pointer to the window object that was
|
||
registered or about to be registered with any sound event. E.g. to register whatever
|
||
sound events and any sound to be played when corresponding event is fired with any
|
||
window object you have to use next functions:
|
||
|
||
BOOL RegisterPlayEvent(CWnd* pWnd, UINT nMsgIDtoStartPlaying,
|
||
LPCTSTR pszFileName, BOOL bLoop=FALSE, int nLoopCount=-1,
|
||
BOOL bForceToStart=TRUE);
|
||
BOOL RegisterPlayEvent(CWnd* pWnd, UINT nMsgIDtoStartPlaying,
|
||
UINT nSoundResource, HINSTANCE hResInstance = AfxGetResourceHandle(),
|
||
BOOL bLoop=FALSE, int nLoopCount=-1, BOOL bForceToStart=TRUE);
|
||
BOOL RegisterPlayEvent(CWnd* pWnd, UINT nMsgIDtoStartPlaying, CFile* pOpenedFile,
|
||
BOOL bLoop=FALSE, int nLoopCount=-1, BOOL bForceToStart=TRUE);
|
||
// --- In : pWnd - pointer to the window for which specified
|
||
// playing event will be created
|
||
// nMsgIDtoStartPlaying - message ID to start playing sound
|
||
// pszFileName - complete path and filename for a
|
||
// WAVE file to open
|
||
// nSoundResource - resourse ID to load WAVE
|
||
// hResInstance - handle to the application that contains
|
||
// specified resourse
|
||
// pOpenedFile - pointer to CFile object from which to
|
||
// read WAVE data
|
||
// bLoop - if TRUE then specified sound will be
|
||
// played in loop, otherwise the specified
|
||
// sound will be played only once
|
||
// nLoopCount - if bLoop is TRUE then this parameter
|
||
// specifies the number of times it will
|
||
// be played (note that if you specify 0 the
|
||
// sound will be played once anyway). If you
|
||
// set it to -1 the specified sound will be
|
||
// played infinitely.
|
||
// bForceToStart - if TRUE then if nMsgIDtoStartPlaying
|
||
// message was fired then any sound effect
|
||
// that is playing at the moment will be
|
||
// stoped and the specified sound effect
|
||
// will be played, otherwise if
|
||
// nMsgIDtoStartPlaying message was fired
|
||
// and if any sound effect is playing at
|
||
// the moment then the specified sound
|
||
// effect won't be played
|
||
//
|
||
// --- Out :
|
||
// --- Returns: TRUE if sound was registereded successfully to be played if
|
||
// nMsgIDtoStartPlaying is fired in pWnd window or FALSE otherwise
|
||
// --- Effect : Register sound effect
|
||
|
||
|
||
So you have to add only one line of code to set sound event for a window object, e.g.:
|
||
|
||
m_SoundEffectOrganizer.RegisterPlayEvent(&m_btnAbout,WM_LBUTTONDOWN,
|
||
_T(".\\Sound\\sound.wav")));
|
||
|
||
As you can see you can use as source of sound an existing sound file or resource
|
||
from your application and you can set additional options that define the way sound
|
||
is played: sound can be played only once or loop infinetely or loop for specified number
|
||
of times. Also you can specify if sound should be started playing even though another
|
||
can be played at the same moment. COXSoundEffectOrganizer will take into account any
|
||
currently playing sound event associated with any registered window object. The same
|
||
considerations apply for next counterparts of COXSoundEffectManager functions:
|
||
|
||
BOOL UnregisterPlayEvent(CWnd* pWnd, UINT nMsgIDtoStartPlaying);
|
||
// --- In : pWnd - pointer to the window for which specified
|
||
// playing event will be unregistered
|
||
// --- nMsgIDtoStartPlaying - registered message ID to start playing
|
||
// sound
|
||
// --- Out :
|
||
// --- Returns: TRUE if sound was unregistereded successfully or FALSE otherwise
|
||
// --- Effect : Unregister sound effect
|
||
|
||
BOOL RegisterStopEvent(CWnd* pWnd, UINT nMsgIDtoStopPlaying);
|
||
// --- In : pWnd - pointer to the window for which specified
|
||
// stop event will be created
|
||
// --- nMsgIDtoStopPlaying - message ID to stop playing sound
|
||
// --- Out :
|
||
// --- Returns: TRUE if the specified event was registereded successfully
|
||
// or FALSE otherwise
|
||
// --- Effect : Register stop event which whould stop playing any effect
|
||
// if have been fired in the specified window
|
||
BOOL UnregisterStopEvent(CWnd* pWnd, UINT nMsgIDtoStopPlaying);
|
||
// --- In : pWnd - pointer to the window for which specified
|
||
// stop event will be unregistered
|
||
// --- nMsgIDtoStopPlaying - registered message ID to stop playing
|
||
// any sound
|
||
// --- Out :
|
||
// --- Returns: TRUE if stop event was unregistereded successfully or FALSE otherwise
|
||
// --- Effect : Unregister stop event
|
||
|
||
BOOL StopPlaying(CWnd* pWnd=NULL);
|
||
// --- In : pWnd - pointer to the window for which any playing
|
||
// event will be stoped. If pWnd is set to NULL
|
||
// then any currently playing sound effect in
|
||
// any window will be stopped
|
||
// --- Out :
|
||
// --- Returns: TRUE if successful or FALSE otherwise
|
||
// --- Effect : Stops playing any registered sound effect in specified window.
|
||
//
|
||
BOOL IsPlaying(CWnd* pWnd=NULL);
|
||
// --- In : pWnd - pointer to the window for which any playing
|
||
// event will be searching for. If pWnd is set
|
||
// to NULL then any currently playing sound
|
||
// effect in any window will be searching for
|
||
// --- Out :
|
||
// --- Returns: TRUE if in specified window any registered sound effect is being
|
||
// played or FALSE otherwise
|
||
// --- Effect :
|
||
|
||
void UnregisterAllEffects(CWnd* pWnd=NULL);
|
||
// --- In : pWnd - pointer to the window for which all
|
||
// registered start and stop playing events
|
||
// will be unregistered. If pWnd is set
|
||
// to NULL then all registered start and stop
|
||
// playing events will be unregistered for all
|
||
// windows
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Unregister all registered start and stop playing events in the
|
||
// specified window
|
||
|
||
void UnregisterAllPlayEvents(CWnd* pWnd=NULL);
|
||
// --- In : pWnd - pointer to the window for which all
|
||
// registered start playing events
|
||
// will be unregistered. If pWnd is set
|
||
// to NULL then all registered start
|
||
// playing events will be unregistered for all
|
||
// windows
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Unregister all registered start playing events in the
|
||
// specified window
|
||
|
||
void UnregisterAllStopEvents(CWnd* pWnd=NULL);
|
||
// --- In : pWnd - pointer to the window for which all
|
||
// registered stop playing events
|
||
// will be unregistered. If pWnd is set
|
||
// to NULL then all registered stop
|
||
// playing events will be unregistered for all
|
||
// windows
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Unregister all registered stop playing events in the
|
||
// specified window
|
||
|
||
Refer to the COXSoundEffectManager class documentation for more detailed description of
|
||
above mentioned functions.
|
||
|
||
There is set of functions that you will hardly use but that are very helpful while
|
||
navigating through all window object registered with some sound events. They are pretty
|
||
explanatory themselves and here is the list of them:
|
||
|
||
inline POSITION GetFirstRegisteredWindow() {
|
||
return m_allSoundEffectManagers.GetStartPosition(); }
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns: A POSITION value that indicates a starting position for iterating
|
||
// the registered window; or NULL if there is no any registered
|
||
// window.
|
||
// --- Effect : Starts an registered windows iteration by returning a POSITION
|
||
// value that can be passed to a GetNextRegisteredWindow call. The
|
||
// iteration sequence is not predictable; therefore, the "first
|
||
// registered window" has no special significance.
|
||
|
||
CWnd* GetNextRegisteredWindow(POSITION& rNextPosition);
|
||
// --- In : rNextPosition - Specifies a reference to a POSITION value
|
||
// returned by a previous GetNextRegisteredWindow
|
||
// or GetNextRegisteredWindow call.
|
||
// --- Out :
|
||
// --- Returns: pointer to the window that has been registered with the organizer
|
||
// --- Effect : Retrieves the the window that has been registered with the
|
||
// organizer at rNextPosition, then updates rNextPosition to refer
|
||
// to the next window. This function is most useful for iterating
|
||
// through all the registered windows.
|
||
// If the retrieved element is the last window, then the new value
|
||
// of rNextPosition is set to NULL.
|
||
|
||
|
||
|
||
If you need full control on COXSoundEffectOrganizer class use next function to get
|
||
pointer to COXSoundEffectManager object used internally to manage sound effects for
|
||
particular window object:
|
||
|
||
COXSoundEffectManager* GetManager(CWnd* pWnd);
|
||
// --- In : pWnd - pointer to the window
|
||
// --- Out :
|
||
// --- Returns: pointer to corresponding COXSoundEffectManager object if successful,
|
||
// or NULL otherwise
|
||
// --- Effect :
|
||
|
||
As we mentioned above these functions are rarely used due to the fact that they
|
||
operate on internal COXSoundEffectOrganizer data and only defined as public ones in
|
||
order to give a sophisticated application a way to control sound events and effects
|
||
at the very low level.
|
||
|
||
But next two functions can be of great value. Every people have their own preferences.
|
||
One sound can be good for one person while unbearable for the other. Choosing the
|
||
right sound can be a nightmare for a programmer. Another problem can be with sequences
|
||
of defined sound events (someone might prefer to hear as less sounds as possible and
|
||
someone else could be a meloman, you never know). So we decided to provide the
|
||
functionality of saving in registry all registered play and stop sound events and
|
||
sound effects. Next two functions are defined:
|
||
|
||
BOOL SaveState(CWnd* pWnd, LPCTSTR lpszProfileName);
|
||
// --- In : pWnd - pointer to the window for which all play and
|
||
// stop event will be saved
|
||
// lpszProfileName - name of hive in registry where
|
||
// all information about sound effects associated
|
||
// with pWnd will be saved.
|
||
// --- Out :
|
||
// --- Returns: TRUE if succeeds, or FALSE otherwise.
|
||
// --- Effect : Saves pWnd's registered start and stop playing
|
||
// effects into registry
|
||
BOOL LoadState(CWnd* pWnd, LPCTSTR lpszProfileName);
|
||
// --- In : pWnd - pointer to the window for which all restored
|
||
// play and stop event will be applied
|
||
// lpszProfileName - name of hive in registry where
|
||
// all information about sound effects associated
|
||
// with pWnd was saved.
|
||
// --- Out :
|
||
// --- Returns: TRUE if succeeds, or FALSE otherwise.
|
||
// --- Effect : Load start and stop playing effects from registry and apply them
|
||
// to specified window
|
||
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
IMPORTANT !!!
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
If you don't need to save state of Sound Effect Manager settings into
|
||
registry then you probably wouldn't like to include source code for
|
||
COXRegistryValFile class into your project (that is a must if you
|
||
call COXSoundEffectOrganizer::SaveState() and/or COXSoundEffectOrganizer::LoadState()).
|
||
If this is a case then you have to include in you stdafx.h file next code:
|
||
|
||
#define OXSE_NO_SAVESTATE
|
||
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
|
||
COXSoundEffectOrganizer class provides all functionality to associate any sound effect
|
||
with any window. It's matter only of one line of code to register any sound event. Plus
|
||
you've got the functionality of saving registered sound events into registry or
|
||
loading from registry and applying previously saved settings. But wouldn't it be nice
|
||
to have standard built-in sound effects customization functionality. In order to
|
||
resolve that problem we designed COXSoundCustomizeDlg class which takes pointer
|
||
to COXSoundEffectOrganizer object and provides user interface to add, delete and
|
||
edit any sound events and effects for all windows registered with given
|
||
COXSoundEffectOrganizer object. Refer to the documentation on COXSoundCustomizeDlg
|
||
class for more details.
|
||
|
||
|
||
|
||
*/
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
|
||
#ifndef _SOUNDEFFECTMANAGER_H
|
||
#define _SOUNDEFFECTMANAGER_H
|
||
|
||
#if _MSC_VER >= 1000
|
||
#pragma once
|
||
#endif // _MSC_VER >= 1000
|
||
|
||
#include "OXDllExt.h"
|
||
|
||
#include "OXHookWnd.h"
|
||
#include "OXSound.h"
|
||
|
||
|
||
#ifndef _WIN32_IE
|
||
#if _MFC_VER>=0x0420
|
||
#define _WIN32_IE 0x0300
|
||
#else
|
||
#define _WIN32_IE 0x0200
|
||
#endif
|
||
#endif
|
||
|
||
|
||
// internally used sound event that specifies that none sound is currently played
|
||
#define SNDEVENT_NONE 0xffffffff
|
||
|
||
// Following structure is defined specifically to describe any sound effect.
|
||
//
|
||
typedef struct _tagSOUNDEFFECT
|
||
{
|
||
COXSound *pSound;
|
||
BOOL bLoop;
|
||
int nLoopCount;
|
||
BOOL bForceToStart;
|
||
|
||
// Constructor
|
||
_tagSOUNDEFFECT()
|
||
{
|
||
pSound=NULL;
|
||
bLoop=FALSE;
|
||
nLoopCount=-1;
|
||
bForceToStart=TRUE;
|
||
}
|
||
|
||
// assignment operator
|
||
_tagSOUNDEFFECT& operator=( const _tagSOUNDEFFECT& se )
|
||
{
|
||
if(this==&se)
|
||
return *this;
|
||
|
||
delete pSound;
|
||
pSound=new COXSound;
|
||
bLoop=se.bLoop;
|
||
nLoopCount=se.nLoopCount;
|
||
bForceToStart=se.bForceToStart;
|
||
return *this;
|
||
}
|
||
|
||
// Destructor
|
||
~_tagSOUNDEFFECT()
|
||
{
|
||
delete pSound;
|
||
}
|
||
|
||
// Serialization. Defined specifically to support save and load sound effect state
|
||
// in COXSoundEffectManager
|
||
void Serialize(CArchive& ar)
|
||
{
|
||
// Only CObject-derived objects and six data-type
|
||
// primitives are serializable. However, you
|
||
// can cast any data type to a serializable data type,
|
||
// and then you can serialize your data. The serializable
|
||
// data types are
|
||
|
||
// BYTE: 8 bits unsigned
|
||
// WORD: 16 bits unsigned
|
||
// LONG: 32 bits unsigned
|
||
// DWORD: 32 bits unsigned
|
||
// float 32 bits
|
||
// double 64 bits, IEEE standard
|
||
|
||
if (ar.IsStoring())
|
||
{
|
||
ar << (DWORD)bLoop;
|
||
ar << (DWORD)nLoopCount;
|
||
ar << (DWORD)bForceToStart;
|
||
}
|
||
else
|
||
{
|
||
delete pSound;
|
||
pSound=new COXSound;
|
||
DWORD dwDummy;
|
||
ar >> dwDummy;
|
||
bLoop=(BOOL)dwDummy;
|
||
ar >> dwDummy;
|
||
nLoopCount=(int)dwDummy;
|
||
ar >> dwDummy;
|
||
bForceToStart=(BOOL)dwDummy;
|
||
}
|
||
}
|
||
|
||
} SOUNDEFFECT, * LPSOUNDEFFECT;
|
||
//
|
||
// pSound - pointer to opened COXSound object
|
||
// bLoop - if TRUE then sound will be played in loop, otherwise it will
|
||
// be played only once
|
||
// nLoopCount - if bLoop is TRUE then if it equals -1 then sound will be
|
||
// looped infinitely, otherwise it defines the number of times
|
||
// it will be looped. The value of zero means that sound will be
|
||
// still played once.
|
||
// bForceToStart - if TRUE then the sound will be started to play even though
|
||
// another sound is played at the same moment, otherwise if any
|
||
// sound was playing at the moment when the associated sound event
|
||
// was fired then the sound won't be played.
|
||
//
|
||
// This structure is specificaly designed to provide customization functionality
|
||
//
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
class OX_CLASS_DECL COXSoundEffectOrganizer;
|
||
|
||
class OX_CLASS_DECL COXSoundEffectManager : public COXHookWnd
|
||
{
|
||
public:
|
||
COXSoundEffectManager(COXSoundEffectOrganizer* pOrganizer=NULL);
|
||
// --- In : pOrganizer - pointer to COXSoundEffectOrganizer object
|
||
// which created this instance of
|
||
// COXSoundEffectManager, otherwise NULL
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Constructs the object
|
||
|
||
protected:
|
||
DECLARE_DYNAMIC(COXSoundEffectManager);
|
||
|
||
// The heart of the class. Handle all needed messages. While deriving
|
||
// your own class make sure to call this function. I wouldn't recommend you
|
||
// to change anything in it
|
||
virtual LRESULT WindowProc(UINT msg, WPARAM wp, LPARAM lp);
|
||
// --- In : msg - message ID
|
||
// wp - WPARAM
|
||
// lp - LPARAM
|
||
// --- Out :
|
||
// --- Returns: result of message handling. Different for different messages.
|
||
// --- Effect : Sets the number of color shades used in gradient filling.
|
||
|
||
// Attributes
|
||
protected:
|
||
// array of all playing events
|
||
CMap<UINT, UINT, LPSOUNDEFFECT, LPSOUNDEFFECT> m_allSoundPlayEvents;
|
||
// array of all stop events
|
||
CMap<UINT, UINT, UINT, UINT> m_allSoundStopEvents;
|
||
|
||
// currently playing event
|
||
UINT m_nCurrentEvent;
|
||
// the next event in the queue
|
||
UINT m_nNextEvent;
|
||
|
||
// pointer to COXSoundOrganizer object which instantiated this instance of
|
||
// the COXSoundEffectManager
|
||
COXSoundEffectOrganizer* m_pOrganizer;
|
||
|
||
// number of times current effect has been played
|
||
int m_nLoopCount;
|
||
|
||
public:
|
||
virtual ~COXSoundEffectManager();
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Destroys the object
|
||
|
||
BOOL Attach(CWnd* pWnd);
|
||
// --- In : pWnd - pointer to created window to be hooked
|
||
// --- Out :
|
||
// --- Returns: TRUE if pWnd was successfully hooked, otherwise FALSE
|
||
// --- Effect : Hooks window
|
||
void Detach();
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Unhooks attached window if any was hooked
|
||
|
||
BOOL RegisterPlayEvent(UINT nMsgIDtoStartPlaying, LPCTSTR pszFileName,
|
||
BOOL bLoop=FALSE, int nLoopCount=-1, BOOL bForceToStart=TRUE);
|
||
BOOL RegisterPlayEvent(UINT nMsgIDtoStartPlaying, UINT nSoundResource,
|
||
HINSTANCE hResInstance = AfxGetResourceHandle(),
|
||
BOOL bLoop=FALSE, int nLoopCount=-1, BOOL bForceToStart=TRUE);
|
||
BOOL RegisterPlayEvent(UINT nMsgIDtoStartPlaying, CFile* pOpenedFile,
|
||
BOOL bLoop=FALSE, int nLoopCount=-1, BOOL bForceToStart=TRUE);
|
||
// --- In : nMsgIDtoStartPlaying - message ID to start playing sound
|
||
// sFileName - complete path and filename for a
|
||
// WAVE file to open
|
||
// nSoundResource - resourse ID to load WAVE
|
||
// hResInstance - handle to the application that contains
|
||
// specified resourse
|
||
// pOpenedFile - pointer to CFile object from which to
|
||
// read WAVE data
|
||
// bLoop - if TRUE then specified sound will be
|
||
// played in loop, otherwise the specified
|
||
// sound will be played only once
|
||
// nLoopCount - if bLoop is TRUE then this parameter
|
||
// specifies the number of times it will
|
||
// be played (note that if you specify 0 the
|
||
// sound will be played once anyway). If you
|
||
// set it to -1 the specified sound will be
|
||
// played infinitely.
|
||
// bForceToStart - if TRUE then if nMsgIDtoStartPlaying
|
||
// message was fired then any sound effect
|
||
// that is playing at the moment will be
|
||
// stoped and the specified sound effect
|
||
// will be played, otherwise if
|
||
// nMsgIDtoStartPlaying message was fired
|
||
// and if any sound effect is playing at
|
||
// the moment then the specified sound
|
||
// effect won't be played
|
||
//
|
||
// --- Out :
|
||
// --- Returns: TRUE if sound was registereded successfully to be played if
|
||
// nMsgIDtoStartPlaying is fired or FALSE otherwise
|
||
// --- Effect : Register sound effect
|
||
|
||
BOOL UnregisterPlayEvent(UINT nMsgIDtoStartPlaying);
|
||
// --- In : nMsgIDtoStartPlaying - registered message ID to start playing
|
||
// sound
|
||
// --- Out :
|
||
// --- Returns: TRUE if sound was unregistereded successfully or FALSE otherwise
|
||
// --- Effect : Unregister sound effect
|
||
|
||
BOOL IsRegisteredPlayEvent(UINT nMsgIDtoStartPlaying);
|
||
// --- In : nMsgIDtoStartPlaying - test message ID to start playing sound
|
||
// --- Out :
|
||
// --- Returns: TRUE if specified event was registereded as the one to start
|
||
// playing sound or FALSE otherwise
|
||
// --- Effect :
|
||
|
||
LPSOUNDEFFECT GetSoundEffect(UINT nMsgIDtoStartPlaying);
|
||
// --- In : nMsgIDtoStartPlaying - registered message ID to start playing
|
||
// sound
|
||
// --- Out :
|
||
// --- Returns: pointer to SOUNDEFFECT structure if successful, or NULL otherwise.
|
||
// SOUNDEFFECT structure is designed specifically to describe any
|
||
// registered sound effect and used internally in the class.
|
||
// It is declared as follows:
|
||
//
|
||
// typedef struct _tagSOUNDEFFECT
|
||
// {
|
||
// // pointer to opened COXSound object
|
||
// COXSound *pSound;
|
||
// // if TRUE then sound will be played in loop, otherwise it
|
||
// // will be played only once
|
||
// BOOL bLoop;
|
||
// // if bLoop is TRUE then if it equals -1 then sound will be
|
||
// // looped infinitely, otherwise it defines the number of
|
||
// // times it will be looped. The value of zero means that
|
||
// // sound will be still played once.
|
||
// int nLoopCount;
|
||
// // if TRUE then the sound will be started to play even though
|
||
// // another sound is played at the same moment, otherwise if
|
||
// // any sound was playing at the moment when the associated
|
||
// // sound event was fired then the sound won't be played.
|
||
// BOOL bForceToStart;
|
||
//
|
||
// . . . . . . . . . . . . . . . . . . . . .
|
||
//
|
||
// }
|
||
//
|
||
// --- Effect :
|
||
|
||
inline POSITION GetFirstPlayEvent() {
|
||
return m_allSoundPlayEvents.GetStartPosition(); }
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns: A POSITION value that indicates a starting position for iterating
|
||
// the play events; or NULL if there is no registered play event.
|
||
// --- Effect : Starts a play events iteration by returning a POSITION value that
|
||
// can be passed to a GetNextPlayEvent call. The iteration sequence is
|
||
// not predictable; therefore, the "first play event" has no special
|
||
// significance.
|
||
|
||
UINT GetNextPlayEvent(POSITION& rNextPosition);
|
||
// --- In : rNextPosition - Specifies a reference to a POSITION value
|
||
// returned by a previous GetNextPlayEvent or
|
||
// GetFirstPlayEvent call.
|
||
// --- Out :
|
||
// --- Returns: message ID that is registered to start playing sound
|
||
// --- Effect : Retrieves the message ID of a play event at rNextPosition, then
|
||
// updates rNextPosition to refer to the next play event. This function
|
||
// is most useful for iterating through all the play events.
|
||
// If the retrieved element is the last play event, then the new value
|
||
// of rNextPosition is set to NULL.
|
||
|
||
|
||
BOOL RegisterStopEvent(UINT nMsgIDtoStopPlaying);
|
||
// --- In : nMsgIDtoStopPlaying - message ID to stop playing sound
|
||
// --- Out :
|
||
// --- Returns: TRUE if the specified event was registereded successfully
|
||
// or FALSE otherwise
|
||
// --- Effect : Register stop event which whould stop playing any effect
|
||
// if have been fired
|
||
|
||
BOOL UnregisterStopEvent(UINT nMsgIDtoStopPlaying);
|
||
// --- In : nMsgIDtoStopPlaying - registered message ID to stop playing
|
||
// any sound
|
||
// --- Out :
|
||
// --- Returns: TRUE if stop event was unregistereded successfully or FALSE otherwise
|
||
// --- Effect : Unregister stop event
|
||
|
||
BOOL IsRegisteredStopEvent(UINT nMsgIDtoStopPlaying);
|
||
// --- In : nMsgIDtoStopPlaying - test message ID to stop playing sound
|
||
// --- Out :
|
||
// --- Returns: TRUE if specified event was registereded as the one to stop
|
||
// playing sound or FALSE otherwise
|
||
// --- Effect :
|
||
|
||
inline POSITION GetFirstStopEvent() {
|
||
return m_allSoundStopEvents.GetStartPosition(); }
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns: A POSITION value that indicates a starting position for iterating
|
||
// the stop events; or NULL if there is no registered stop event.
|
||
// --- Effect : Starts a stop events iteration by returning a POSITION value that
|
||
// can be passed to a GetNextStopEvent call. The iteration sequence is
|
||
// not predictable; therefore, the "first stop event" has no special
|
||
// significance.
|
||
|
||
UINT GetNextStopEvent(POSITION& rNextPosition);
|
||
// --- In : rNextPosition - Specifies a reference to a POSITION value
|
||
// returned by a previous GetNextStopEvent or
|
||
// GetFirstStopEvent call.
|
||
// --- Out :
|
||
// --- Returns: message ID that is registered to stop any playing sound
|
||
// --- Effect : Retrieves the message ID of a stop event at rNextPosition, then
|
||
// updates rNextPosition to refer to the next stop event. This function
|
||
// is most useful for iterating through all the stop events.
|
||
// If the retrieved element is the last play event, then the new value
|
||
// of rNextPosition is set to NULL.
|
||
|
||
|
||
|
||
BOOL StopPlaying();
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns: TRUE if successful or FALSE otherwise
|
||
// --- Effect : Stops playing any registered sound effect
|
||
BOOL IsPlaying();
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns: TRUE if any registered sound effect is being played
|
||
// or FALSE otherwise
|
||
// --- Effect :
|
||
|
||
void UnregisterAllEffects();
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Unregister all registered start and stop playing events
|
||
|
||
void UnregisterAllPlayEvents();
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Unregister all registered start playing events
|
||
|
||
void UnregisterAllStopEvents();
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Unregister all registered stop playing events
|
||
|
||
virtual void Serialize(CArchive& ar);
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : serialize all registered start and stop playing events
|
||
|
||
#ifndef OXSE_NO_SAVESTATE
|
||
// Save to and load from registry all registered start and stop playing events
|
||
// These functions require using COXRegistryValFile class. If you
|
||
// are not going to use them then you can include in your stdafx.h
|
||
// file next code:
|
||
//
|
||
// #define OXSE_NO_SAVESTATE
|
||
//
|
||
// In this case you don't need to include into your project references
|
||
// to source code for COXRegistryValFile class.
|
||
//
|
||
BOOL SaveState(LPCTSTR lpszProfileName);
|
||
// --- In : lpszProfileName - name of hive in registry where
|
||
// all information about COXSoundEffectManager
|
||
// will be saved.
|
||
// --- Out :
|
||
// --- Returns: TRUE if succeeds, or FALSE otherwise.
|
||
// --- Effect : Saves COXSoundEffectManager registered start and stop playing
|
||
// effects into registry
|
||
BOOL LoadState(LPCTSTR lpszProfileName);
|
||
// --- In : lpszProfileName - name of hive in registry where
|
||
// all information about COXSoundEffectManager
|
||
// was saved.
|
||
// --- Out :
|
||
// --- Returns: TRUE if succeeds, or FALSE otherwise.
|
||
// --- Effect : Loads COXSoundEffectManager start and stop playing effects from
|
||
// registry file
|
||
#endif // OXCP_NO_SAVESTATE
|
||
|
||
protected:
|
||
// creates sound
|
||
COXSound* CreateSound();
|
||
// register sound effect
|
||
BOOL RegisterSoundEffect(UINT nMsgIDtoStartPlaying, COXSound* pSound,
|
||
BOOL bLoop=FALSE, int nLoopCount=-1, BOOL bForceToStart=TRUE);
|
||
// start playing current sound effect
|
||
BOOL StartPlaying();
|
||
// reset all settings
|
||
void Reset();
|
||
|
||
};
|
||
|
||
|
||
|
||
class OX_CLASS_DECL COXSoundEffectOrganizer
|
||
{
|
||
public:
|
||
COXSoundEffectOrganizer();
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Constructs the object
|
||
|
||
protected:
|
||
|
||
// Attributes
|
||
protected:
|
||
CMap<CWnd*, CWnd*, COXSoundEffectManager*, COXSoundEffectManager*>
|
||
m_allSoundEffectManagers;
|
||
|
||
public:
|
||
virtual ~COXSoundEffectOrganizer();
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Destroys the object
|
||
|
||
BOOL RegisterPlayEvent(CWnd* pWnd, UINT nMsgIDtoStartPlaying,
|
||
LPCTSTR pszFileName, BOOL bLoop=FALSE, int nLoopCount=-1,
|
||
BOOL bForceToStart=TRUE);
|
||
BOOL RegisterPlayEvent(CWnd* pWnd, UINT nMsgIDtoStartPlaying,
|
||
UINT nSoundResource, HINSTANCE hResInstance = AfxGetResourceHandle(),
|
||
BOOL bLoop=FALSE, int nLoopCount=-1, BOOL bForceToStart=TRUE);
|
||
BOOL RegisterPlayEvent(CWnd* pWnd, UINT nMsgIDtoStartPlaying, CFile* pOpenedFile,
|
||
BOOL bLoop=FALSE, int nLoopCount=-1, BOOL bForceToStart=TRUE);
|
||
// --- In : pWnd - pointer to the window for which specified
|
||
// playing event will be created
|
||
// nMsgIDtoStartPlaying - message ID to start playing sound
|
||
// sFileName - complete path and filename for a
|
||
// WAVE file to open
|
||
// nSoundResource - resourse ID to load WAVE
|
||
// hResInstance - handle to the application that contains
|
||
// specified resourse
|
||
// pOpenedFile - pointer to CFile object from which to
|
||
// read WAVE data
|
||
// bLoop - if TRUE then specified sound will be
|
||
// played in loop, otherwise the specified
|
||
// sound will be played only once
|
||
// nLoopCount - if bLoop is TRUE then this parameter
|
||
// specifies the number of times it will
|
||
// be played (note that if you specify 0 the
|
||
// sound will be played once anyway). If you
|
||
// set it to -1 the specified sound will be
|
||
// played infinitely.
|
||
// bForceToStart - if TRUE then if nMsgIDtoStartPlaying
|
||
// message was fired then any sound effect
|
||
// that is playing at the moment will be
|
||
// stoped and the specified sound effect
|
||
// will be played, otherwise if
|
||
// nMsgIDtoStartPlaying message was fired
|
||
// and if any sound effect is playing at
|
||
// the moment then the specified sound
|
||
// effect won't be played
|
||
//
|
||
// --- Out :
|
||
// --- Returns: TRUE if sound was registereded successfully to be played if
|
||
// nMsgIDtoStartPlaying is fired in pWnd window or FALSE otherwise
|
||
// --- Effect : Register sound effect
|
||
|
||
BOOL UnregisterPlayEvent(CWnd* pWnd, UINT nMsgIDtoStartPlaying);
|
||
// --- In : pWnd - pointer to the window for which specified
|
||
// playing event will be unregistered
|
||
// --- nMsgIDtoStartPlaying - registered message ID to start playing
|
||
// sound
|
||
// --- Out :
|
||
// --- Returns: TRUE if sound was unregistereded successfully or FALSE otherwise
|
||
// --- Effect : Unregister sound effect
|
||
|
||
COXSoundEffectManager* GetManager(CWnd* pWnd);
|
||
// --- In : pWnd - pointer to the window
|
||
// --- Out :
|
||
// --- Returns: pointer to corresponding COXSoundEffectManager object if successful,
|
||
// or NULL otherwise
|
||
// --- Effect :
|
||
|
||
inline POSITION GetFirstRegisteredWindow() {
|
||
return m_allSoundEffectManagers.GetStartPosition(); }
|
||
// --- In :
|
||
// --- Out :
|
||
// --- Returns: A POSITION value that indicates a starting position for iterating
|
||
// the registered window; or NULL if there is no any registered
|
||
// window.
|
||
// --- Effect : Starts an registered windows iteration by returning a POSITION
|
||
// value that can be passed to a GetNextRegisteredWindow call. The
|
||
// iteration sequence is not predictable; therefore, the "first
|
||
// registered window" has no special significance.
|
||
|
||
CWnd* GetNextRegisteredWindow(POSITION& rNextPosition);
|
||
// --- In : rNextPosition - Specifies a reference to a POSITION value
|
||
// returned by a previous GetNextRegisteredWindow
|
||
// or GetNextRegisteredWindow call.
|
||
// --- Out :
|
||
// --- Returns: pointer to the window that has been registered with the organizer
|
||
// --- Effect : Retrieves the the window that has been registered with the
|
||
// organizer at rNextPosition, then updates rNextPosition to refer
|
||
// to the next window. This function is most useful for iterating
|
||
// through all the registered windows.
|
||
// If the retrieved element is the last window, then the new value
|
||
// of rNextPosition is set to NULL.
|
||
|
||
BOOL RegisterStopEvent(CWnd* pWnd, UINT nMsgIDtoStopPlaying);
|
||
// --- In : pWnd - pointer to the window for which specified
|
||
// stop event will be created
|
||
// --- nMsgIDtoStopPlaying - message ID to stop playing sound
|
||
// --- Out :
|
||
// --- Returns: TRUE if the specified event was registereded successfully
|
||
// or FALSE otherwise
|
||
// --- Effect : Register stop event which whould stop playing any effect
|
||
// if have been fired in the specified window
|
||
BOOL UnregisterStopEvent(CWnd* pWnd, UINT nMsgIDtoStopPlaying);
|
||
// --- In : pWnd - pointer to the window for which specified
|
||
// stop event will be unregistered
|
||
// --- nMsgIDtoStopPlaying - registered message ID to stop playing
|
||
// any sound
|
||
// --- Out :
|
||
// --- Returns: TRUE if stop event was unregistereded successfully or FALSE otherwise
|
||
// --- Effect : Unregister stop event
|
||
|
||
BOOL StopPlaying(CWnd* pWnd=NULL);
|
||
// --- In : pWnd - pointer to the window for which any playing
|
||
// event will be stoped. If pWnd is set to NULL
|
||
// then any currently playing sound effect in
|
||
// any window will be stopped
|
||
// --- Out :
|
||
// --- Returns: TRUE if successful or FALSE otherwise
|
||
// --- Effect : Stops playing any registered sound effect in specified window.
|
||
//
|
||
BOOL IsPlaying(CWnd* pWnd=NULL);
|
||
// --- In : pWnd - pointer to the window for which any playing
|
||
// event will be searching for. If pWnd is set
|
||
// to NULL then any currently playing sound
|
||
// effect in any window will be searching for
|
||
// --- Out :
|
||
// --- Returns: TRUE if in specified window any registered sound effect is being
|
||
// played or FALSE otherwise
|
||
// --- Effect :
|
||
|
||
void UnregisterAllEffects(CWnd* pWnd=NULL);
|
||
// --- In : pWnd - pointer to the window for which all
|
||
// registered start and stop playing events
|
||
// will be unregistered. If pWnd is set
|
||
// to NULL then all registered start and stop
|
||
// playing events will be unregistered for all
|
||
// windows
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Unregister all registered start and stop playing events in the
|
||
// specified window
|
||
|
||
void UnregisterAllPlayEvents(CWnd* pWnd=NULL);
|
||
// --- In : pWnd - pointer to the window for which all
|
||
// registered start playing events
|
||
// will be unregistered. If pWnd is set
|
||
// to NULL then all registered start
|
||
// playing events will be unregistered for all
|
||
// windows
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Unregister all registered start playing events in the
|
||
// specified window
|
||
|
||
void UnregisterAllStopEvents(CWnd* pWnd=NULL);
|
||
// --- In : pWnd - pointer to the window for which all
|
||
// registered stop playing events
|
||
// will be unregistered. If pWnd is set
|
||
// to NULL then all registered stop
|
||
// playing events will be unregistered for all
|
||
// windows
|
||
// --- Out :
|
||
// --- Returns:
|
||
// --- Effect : Unregister all registered stop playing events in the
|
||
// specified window
|
||
|
||
|
||
#ifndef OXSE_NO_SAVESTATE
|
||
// Save to and load from registry all registered start and stop playing events
|
||
// for specified window. These functions require using COXRegistryValFile class.
|
||
// If you are not going to use them then you can include in your stdafx.h
|
||
// file next code:
|
||
//
|
||
// #define OXSE_NO_SAVESTATE
|
||
//
|
||
// In this case you don't need to include into your project references
|
||
// to source code for COXRegistryValFile class.
|
||
//
|
||
BOOL SaveState(CWnd* pWnd, LPCTSTR lpszProfileName);
|
||
// --- In : pWnd - pointer to the window for which all play and
|
||
// stop event will be saved
|
||
// lpszProfileName - name of hive in registry where
|
||
// all information about sound effects associated
|
||
// with pWnd will be saved.
|
||
// --- Out :
|
||
// --- Returns: TRUE if succeeds, or FALSE otherwise.
|
||
// --- Effect : Saves pWnd's registered start and stop playing
|
||
// effects into registry
|
||
BOOL LoadState(CWnd* pWnd, LPCTSTR lpszProfileName);
|
||
// --- In : pWnd - pointer to the window for which all restored
|
||
// play and stop event will be applied
|
||
// lpszProfileName - name of hive in registry where
|
||
// all information about sound effects associated
|
||
// with pWnd was saved.
|
||
// --- Out :
|
||
// --- Returns: TRUE if succeeds, or FALSE otherwise.
|
||
// --- Effect : Load start and stop playing effects from registry and apply them
|
||
// to specified window
|
||
#endif // OXCP_NO_SAVESTATE
|
||
|
||
protected:
|
||
// instantiates COXSoundEffectmanager object
|
||
COXSoundEffectManager* CreateManager(CWnd* pWnd);
|
||
};
|
||
|
||
|
||
#endif // _SOUNDEFFECTMANAGER_H
|
||
|