⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audio2eng.cpp

📁 《SymbianOSC手机应用开发》源码
💻 CPP
字号:
/* Copyright (c) 2004, Symbian Software Ltd. All rights reserved */

#ifndef __Audio2ENG_H_
#define __Audio2ENG_H_

#include "Audio2eng.h"
#include "Audio2Ui.h"
#include "Audio2.hrh"

CAudio2Engine::CAudio2Engine(CAudio2Ui& aAppUi) : 
    iState(ENotReady),
    iAppUi(aAppUi)
    {
    }

void CAudio2Engine::SetArrays(RArray<TFourCC>* aDataTypes,
                         RArray<TUint>* aSampleRates,
                         RArray<TUint>* aChannels)
    {
    iDataTypes=aDataTypes;
    iSampleRates=aSampleRates;
    iChannels=aChannels;
    }

CAudio2Engine* CAudio2Engine::NewL(CAudio2Ui& aAppUi)
    {
    CAudio2Engine* self = NewLC(aAppUi);
    CleanupStack::Pop();  // self
    return self;
    }

CAudio2Engine* CAudio2Engine::NewLC(CAudio2Ui& aAppUi)
    {
    CAudio2Engine* self = new (ELeave) CAudio2Engine(aAppUi);
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
    }

_LIT(KFileName,"rec.wav");

void CAudio2Engine::ConstructL()
    {
    delete iUtility;
    iUtility=NULL;
    iUtility = CMdaAudioRecorderUtility::NewL(*this);
    iUtility->OpenFileL(KFileName);
    }

void CAudio2Engine::ConvertL(TPtrC aExt, TInt aCodecIndex, TInt aSampleRatesIndex, TInt aChannelsIndex)
    {
    iCodecIndex=aCodecIndex;
    iSampleRatesIndex=aSampleRatesIndex;
    iChannelsIndex=aChannelsIndex;
    iState=EOpeningConverter;
    OpenConverterL(aExt);
    }

void CAudio2Engine::OpenConverterL(TPtrC aExt)
    {
    if (iConverter)
        {
        delete iConverter;
        iConverter=NULL;
        };

    iConverter=CMdaAudioConvertUtility::NewL(*this);
    _LIT(KConvertName,"conv");

    TBuf<32> fileName;
    fileName=KConvertName;
    fileName.Append(aExt);

    RFs session;
    session.Connect();
    session.Delete(fileName);
    session.Close();

    iConverter->OpenL(KFileName, fileName);
    }

void CAudio2Engine::GetFormatsL(TPtrC aExt)
    {
    iState=EGettingConversionFormats;
    OpenConverterL(aExt);
    }

void CAudio2Engine::GetFormats2L()
    {
    //ask the destination which types it supports    
    TRAPD(err,iConverter -> GetSupportedDestinationDataTypesL(*iDataTypes));
    if (err != KErrNotSupported)
        User::LeaveIfError(err);
    
    TRAP(err,iConverter -> GetSupportedConversionSampleRatesL(*iSampleRates));
    if (err != KErrNotSupported)
        User::LeaveIfError(err);

    TRAP(err,iConverter -> GetSupportedConversionNumberOfChannelsL(*iChannels));
    if (err != KErrNotSupported) 
        User::LeaveIfError(err);
    iConversionTypes=ETrue;
    }

void CAudio2Engine::Convert2L()
    {
    if (iCodecIndex!=-1)//selections were made
        {
        TFourCC cc=(*iDataTypes)[iCodecIndex];
        iConverter->SetDestinationDataTypeL(cc);
        TInt s=(*iSampleRates)[iSampleRatesIndex];
        iConverter->SetDestinationSampleRateL(s);
        TInt c=(*iChannels)[iChannelsIndex];
        iConverter->SetDestinationNumberOfChannelsL(c);
        }
    iConverter->ConvertL();
    }

CAudio2Engine::~CAudio2Engine()
    {
    delete iUtility;    
    iUtility = NULL;

    delete iConverter;
    iConverter=NULL;
    }

void CAudio2Engine::PlayL()
    {
    iUtility->PlayL();
    }

void CAudio2Engine::StopL()
    {
    if (iState==ERecording)
        {
        iUtility->Stop();
        iRecorded=ETrue;
        }

    if (iState==EConverting)
        iConverter->Stop();

    iState=EReady;
    }

// Set options and start recording
void CAudio2Engine::StartRecordingL()
    {
    iUtility -> SetAudioDeviceMode(CMdaAudioRecorderUtility::EDefault);
    iUtility -> RecordL();
    }
    
void CAudio2Engine::RecordTypesL(CDesCArray& aTypeArray)
    {
    RMMFControllerImplInfoArray controllers;
    CleanupResetAndDestroyPushL(controllers);

    CMMFControllerPluginSelectionParameters* cSelect = CMMFControllerPluginSelectionParameters::NewLC();
    CMMFFormatSelectionParameters* fSelectRead = CMMFFormatSelectionParameters::NewLC();
    CMMFFormatSelectionParameters* fSelectWrite = CMMFFormatSelectionParameters::NewLC();

    RArray<TUid> mediaIds;
    mediaIds.Append(KUidMediaTypeAudio);
    CleanupClosePushL(mediaIds);
    cSelect->SetMediaIdsL(mediaIds, CMMFPluginSelectionParameters::EAllowOnlySuppliedMediaIds);
    cSelect->SetRequiredPlayFormatSupportL(*fSelectRead);
    cSelect->SetRequiredRecordFormatSupportL(*fSelectWrite); // need to specify this as otherwise the supported record formats won't be retrieved
    cSelect->ListImplementationsL(controllers);

    TBuf<10> buf;
    // Loop through each returned plug-in and get their record formats
    for (TInt i=0; i<controllers.Count(); i++)
        {
        const RMMFFormatImplInfoArray& recordInfo =  controllers[i]->RecordFormats();
        // Get array of supported file extensions.
        for (TInt j=0; j<recordInfo.Count(); j++)
            {
            const CDesC8Array& extensions = recordInfo[j]->SupportedFileExtensions();
            // and finally add each extension to the array
            for (TInt k=0; k<extensions.Count(); k++)
                {
                buf.Copy(extensions[k]);
                aTypeArray.AppendL(buf);
                } 
            } 
        }
    CleanupStack::PopAndDestroy(5);
    }

void CAudio2Engine::MoscoStateChangeEvent(CBase* aObject, TInt /*aPreviousState*/, TInt aCurrentState, TInt aErrorCode)
    {
    if (aErrorCode!=KErrNone)
        {//message
        iState=ENotReady;
        return;
        }

    if (aObject==iUtility)    
        switch (aCurrentState)
            {
            case CMdaAudioClipUtility::EOpen:
                iState=EReady;
                break;
            case CMdaAudioClipUtility::ERecording:
                iState=ERecording;
                break;
            case CMdaAudioClipUtility::EPlaying:
                iState=EPlaying;
                break;
            default:;
            }
    else //must be converter
        switch (aCurrentState)
            {
            case CMdaAudioClipUtility::EOpen:
                {
                if (iState==EGettingConversionFormats)
                    {
                    GetFormats2L();
                    iState=EReady;
                    break;
                    }
                else
                    {
                    TState state=iState;                
                    iState=EReady;
                    if (state!=EConverting)
                        Convert2L();
                    break;
                    }
                }
            case CMdaAudioClipUtility::ERecording:
                iState=EConverting;
                break;
            case CMdaAudioClipUtility::EPlaying:
                iState=EConverting;
                break;
            default:;
            }
    }

void CAudio2Engine::UpdateMenu(CEikMenuPane* aMenuPane)
    {
    switch(iState)
        {
        case ENotReady:
            aMenuPane->SetItemDimmed(ECmdRecord, EFalse);
            aMenuPane->SetItemDimmed(ECmdPlay, ETrue);
            aMenuPane->SetItemDimmed(ECmdStop, ETrue);
            aMenuPane->SetItemDimmed(ECmdConversionFormats, ETrue);
            aMenuPane->SetItemDimmed(ECmdConversionTypes, ETrue);
            aMenuPane->SetItemDimmed(ECmdConvert, ETrue);
            break;

        case EReady:
            aMenuPane->SetItemDimmed(ECmdRecord, EFalse);
            aMenuPane->SetItemDimmed(ECmdPlay, EFalse);
            aMenuPane->SetItemDimmed(ECmdStop, ETrue);
            aMenuPane->SetItemDimmed(ECmdConversionFormats, !iRecorded);
            aMenuPane->SetItemDimmed(ECmdConversionTypes, !iConversionTypes);
            aMenuPane->SetItemDimmed(ECmdConvert, !iConversionTypes);
            break;

        case EPlaying:
        case ERecording:
        case EConverting:
            aMenuPane->SetItemDimmed(ECmdRecord, ETrue);
            aMenuPane->SetItemDimmed(ECmdPlay, ETrue);
            aMenuPane->SetItemDimmed(ECmdStop, EFalse);
            aMenuPane->SetItemDimmed(ECmdConversionFormats, ETrue);
            aMenuPane->SetItemDimmed(ECmdConversionTypes, ETrue);
            aMenuPane->SetItemDimmed(ECmdConvert, ETrue);
            break;
        default:
            break;
        }
    }

#endif// __Audio2ENG_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -