The Audio Tone Player, provided by the class CMdaAudioToneUtility
, has an interface for generating the following tones on all audio
capable devices. Using this class you can play the following tones:
Single tone of a specified duration and frequency
Dual Tone Multi Frequency (DTMF) strings
Sequences of tones held in files or descriptors
Predefined (fixed) sequences of tones held in any mobile equipment
Client applications such as ringtone applications, use CMdaAudioToneUtility
to generate the tones they produce.
The tone player in turn uses MMF for playing sounds and is also credited
for interfacing with the audio hardware. An active scheduler is needed
for all the clients applications for the use of active objects and
callbacks.
The tone player provides a simple interface to generate single and multiple tones. Once the tone player object has been constructed, multiple tones and tone sequences can be played without having to create new instances of the object.
Using the tone player typically involves the following steps:
Figure: Tone Player Utility
The CMdaAudioToneUtility
object
can be constructed using the NewL()
member function.
There are two versions of this constructor function:
create a tone player with default priority settings:
static CMdaAudioToneUtility* NewL(MMdaAudioToneObserver& aObserver, CMdaServer* aServer=NULL);
create a tone player with your own settings:
static CMdaAudioToneUtility* NewL(MMdaAudioToneObserver& aObserver, CMdaServer* aServer, TInt aPriority, TMdaPriorityPreference aPref=EMdaPriorityPreferenceTimeAndQuality);
Both functions pass a reference of the MMdaAudioToneObserver
object to the tone player. The MMdaAudioToneObserver
is an observer interface to notifications from the member functions Prepare, Play, and, CancelPlay callback functions.
Once the tone player object is created, it has to be prepared to play a tone or a DTMF string. use one of the following prepare member functions to get it ready for playing the corresponding tone.
PrepareToPlayTone()
- to play a single tone of a fixed frequency (Hz) and duration (microseconds).
For example:
virtual void PrepareToPlayTone(TInt aFrequency, const TTimeIntervalMicroSeconds& aDuration);
PrepareToPlayDTMFString()
- to play a DTMF string held in a descriptor. For example:
virtual void PrepareToPlayDTMFString(const TDesC& aDTMF);
PrepareToPlayFileSequence()
- to play a sequence of non-DTMF tones held in a file. For example:
virtual void PrepareToPlayFileSequence(const TDesC& aFilename);
PrepareToPlayDesSequence()
- to play a sequence of non-DTMF tones held in a descriptor. For
example:
virtual void PrepareToPlayDesSequence(const TDesC8& aSequence);
PrepareToPlayFixedSequence()
- to play a sequence of non-DTMF tones stored on the mobile equipment.
For example:
virtual void PrepareToPlayFixedSequence(TInt aSequenceNumber);
PrepareToPlayDualTone()
- to play a dual tone. For example:
void PrepareToPlayDualTone(TInt aFrequencyOne, TInt aFrequencyTwo, const TTimeIntervalMicroSeconds& aDuration);
The two tones, aFrequencyOne and aFrequencyTwo, are measured in Hz, and the duration of the tone, aDuration, is measured in microseconds.
All the prepare member functions are asynchronous. In response
to each, CMdaAudioToneUtility
creates a CMMFToneConfig
derived object that stores the data for the
type of tone to play.
On completion of a prepare, the observer
function MMdaAudioToneObserver::MatoPrepareComplete()
is called, indicating the success or failure of the prepare operation.
If successful you can play the tone.
You can cancel any prepare function using CancelPrepare() (the observer callback function is not called on completion of the cancel).
Once the player is prepared successfully, certain configurations can be done before playing the tone as listed below:
Volume() and SetVolume() - This retrieves the current volume settings and sets to a new value specified by the user respectively.
GetBalanceL() and SetBalanceL() - This retrieves the current balance of the audio device and sets the audio balance specified by the user respectively..
SetPriority() - This sets the priority of the audio device. The priority is defined to arbitrate between multiple objects trying to access the controller at the same time.
SetVolumeRamp() - This defines the period over which the volume level is to rise
(in microseconds) smoothly from zero to the specified volume level.
A value of 0
causes the tone to be played at the SetVolume()
level for the full duration of the playback.
A value that is longer than the duration of the tone sequence means
that the tone never reaches the specified volume.
virtual void SetVolumeRamp(const TTimeIntervalMicroSeconds &aRampDuration);
SetDTMFLengths() - This alters the duration of DTMF tone, the gaps between two DTMF tones, and the pauses in microseconds.
FixedSequenceCount() - This returns the number of available pre-defined tone sequences, the number always being greater than zero.
FixedSequenceName() - This returns the name of the specified fixed tone sequence.
Upon successful configuration, the Play() can be called as shown below.
Play()
- plays the tone, DTMF
or tone sequence specified by the prepare statement. For example:
virtual void Play();
Here, the tone player uses the Play() from the audio player utility to play the tone.
This function is
asynchronous. It retrieves the details of the type of tone to play
from the previous Prepare
statement. When the tone
has been played to completion, the observer callback function MMdaAudioToneObserver::MatoPlayComplete()
is called, indicating
the success or failure of the play operation. The play operation can
be cancelled by calling the CancelPlay() member function.
Playing the tone or DTMF string can be customised using the following member functions as mentioned below:
SetRepeats()
- sets the number of times the tone sequence (plus an optional trailing
silent period, measured in microseconds) is repeated during the play
operation. For example:
virtual void SetRepeats(TInt aRepeatNumberOfTimes, const TTimeIntervalMicroSeconds &aTrailingSilence);
You can repeat the tone sequence indefinitely by setting aRepeatNumberOfTimes
to KMdaRepeatForever
.
State()
- returns the current state of the tone player (an enum):
EMdaAudioToneUtilityNotReady
- not prepared to play a tone
EMdaAudioToneUtilityPrepared
- prepared and ready to play a tone
EMdaAudioToneUtilityPlaying
- currently playing a tone
For example:
virtual TMdaAudioToneUtilityState State();
To play another tone or sequence, either wait for MMdaAudioToneObserver::MatoPlayComplete()
callback to be
issued when the current tone or DTMF string completes playing, or
use CancelPlay() and then issue the relevant prepare statement.
The Play() function following the prepare statement
plays the tone or DTMF string based on the previously issued prepare
statement.
CancelPlay() - cancels the tone, DTMF, or tone sequence currently playing. For example:
virtual void CancelPlay();
The observer callback function is not called on completion of the cancel.
To retrieve a custom interface to the underlying
device, use the CustomInterface()
member function.
For example:
IMPORT_C TAny *CustomInterface(TUid aInterfaceId);
aInterfaceId
is the UID of the interface function
required.
The function returns a pointer to the interface implementation, or NULL if the device does not implement the interface requested. You must cast the return value to the correct type.