Discussion Board

Results 1 to 2 of 2
  1. #1
    Registered User
    Join Date
    May 2003

    Playing Sound From a Buffer

    Hi Guys,

    Do Anyone know the best way to play a sound which is stored in a buffer on Series 60.

    I am currently using the CMdaAudioRecorderUtility class to play the sound, however when Play() is called, I get "System error Try again (-18)".

    This is strange because inside the MoscoStateChangeEvent function, the current state of the CMdaAudioRecorderUtility object is EOpen....hence it is ready to play..but it doesn't.

    Also I know the buffer I pass is ok because it starts with RIFF1/4WAV which proves that the data in the buffer is .WAV audio content.

    here is my code below:

    void _CPP_Peer_PlayAudio(int in_wnd, TUint8* soundData, int aDataSize)

    //The Sound data to Play
    TPtr8 dataToPlay( (TUint8*)soundData, aDataSize, aDataSize);

    CPlayerAdapter* ptr->iPlayerAdapter = CPlayerAdapter::NewWithDataL(dataToPlay);


    The CPlayerAdapter is the same one as in S60 examples, but I use CMdaAudioRecorderUtility instead of CMdaAudiopPlayerUtility. Here is the CPlayerAdater code :

    CPlayerAdapter::CPlayerAdapter() :

    CPlayerAdapter* CPlayerAdapter::NewWithDataL(TDes8& aData)
    CPlayerAdapter* self = NewWithDataLC(aData);
    CleanupStack::Pop(); // self
    return self;

    CPlayerAdapter* CPlayerAdapter::NewWithDataLC(TDes8& aData)
    CPlayerAdapter* self = new (ELeave) CPlayerAdapter();
    return self;

    void CPlayerAdapter::ConstructWithDataL(TDes8& aData)
    iMdaAudioRecorderUtility = CMdaAudioRecorderUtility::NewL(*this);

    // Open an existing sample file for playback or recording causes MMdaObjectStateChangeObserver::MoscoStateChangeEvent to be called

    // from MMdaObjectStateChangeObserver
    void CPlayerAdapter::MoscoStateChangeEvent(CBase* /*aObject*/, TInt aPreviousState, TInt aCurrentState, TInt aErrorCode)
    switch (iMdaAudioRecorderUtility->State())
    case CMdaAudioRecorderUtility::EOpen:
    iState = EReadyToPlay;

    void CPlayerAdapter::PlayL()
    // Play through the device speaker

    // Set maximum volume for playback

    // Set the playback position to the start of the file


    iState = EPlaying;

    As soon as iMdaAudioRecorderUtility->PlayL(); is called I get error code -18.

    The funny thing is that if I supply a filename then the sound plays fine but it can't play with a buffer.

    Any help or examples would be greatly appreciated!!!!

    or does anyone have a better way to play sounds from a buffer??

  2. #2
    Registered User
    Join Date
    Aug 2003

    about play raw data buffer

    you may try those source codes.

    1. #include <mdaaudiooutputstream.h>
    #include <mda\common\audio.h>

    2. import mediaclientaudiostream.lib

    3. inheriting class MMdaAudioOutputStreamCallback

    4. declare this methids:
    void OpenStream();
    virtual void MaoscOpenComplete(TInt aError);
    virtual void MaoscBufferCopied(TInt aError, const TDesC8& );
    virtual void MaoscPlayComplete(TInt aError);

    CMdaAudioOutputStream* iStream;
    TMdaAudioDataSettings iSettings;

    5. Implement class methods:
    void [class name]::OpenStream() {
    iStream = CMdaAudioOutputStream::NewL(*this);

    void [class name]::MaoscOpenComplete(TInt aError) {
    if (aError==KErrNone) {
    iStream->SetAudioPropertiesL(TMdaAudioDataSettings::ESampleRate8000Hz, TMdaAudioDataSettings::EChannelsMono);
    iStream->SetPriority(EPriorityMuchMore, EMdaPriorityPreferenceNone);
    void [class name]::MaoscBufferCopied(TInt aError, const TDesC8& )
    if (aError==KErrNone) {

    void [class name]::MaoscPlayComplete(TInt aError) {
    if (aError==KErrUnderflow) {

    6. if that code was prepared , you can use the sample code to play buffer.

    TInt16* TmpBuffer2 = new TInt16[BUFFERSIZE];
    TPtr8* iTmpBuf = new TPtr8((TUint8*)TmpBuffer2, BUFFERSIZE, BUFFERSIZE*2);

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts