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

📄 wavegen_engine.h

📁 symbian学习音乐播放的源代码
💻 H
字号:
//
// wavegen_engine.h
//
// Copyright (C) 2002 Nokia Corporation. All rights reserved.
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(__WAVEGEN_ENGINE_H__)
#define __WAVEGEN_ENGINE_H__

#if !defined(__MDA_COMMON_AUDIO_H__)
#include <mda\common\audio.h>
#endif

#if !defined(__MDA_CLIENT_UTILITY_H__)
#include <Mda\Client\Utility.h>
#endif

#if !defined(__MDA_COMMON_RESOURCE_H__)
#include <Mda\Common\Resource.h>
#endif

#if !defined(__MDAAUDIOOUTPUTSTREAM_H__)
#include <MdaAudioOutputStream.h>
#endif


// CONSTANTS

// waveform generator buffer size
const TInt KBufferSize = 8192;

// slider max values
const TInt KVolSliderLength	= 10;
const TInt KFreqSliderLength = 10;

const TInt KInitialWaveform = 0;
const TInt KInitialVolume = 1;
const TInt KInitialFreq = 5;

// max pulse amplitude - used in waveform generation
const TInt KPulseAmplitude = 26213;


// FORWARD DECLARATIONS

class CWaveGenerator;
class CEikonEnv;

//
// CStreamAudioEngine - audio ouput stream engine, uses CMdaAudioOutputStream
// and implements the callback functions from MMdaAudioOutputStreamCallback.
//
class CStreamAudioEngine : public CBase, public MMdaAudioOutputStreamCallback
	{
public:

    enum TEngineStatus
        {
        EEngineNotReady,
        EEngineReady,
        EEnginePlaying        
        };

    static CStreamAudioEngine* NewL();
	
	~CStreamAudioEngine();	
	void PlayL();
    void StopL();

    // switches between two buffers
    TBool SwitchBuffer(TBool aBufGenerator);

    // from MMdaAudioOutputStreamCallback
	virtual void MaoscOpenComplete(TInt aError);
	virtual void MaoscBufferCopied(TInt aError, const TDesC8& aBuffer);
	virtual void MaoscPlayComplete(TInt aError);

	// inline gets and sets
    inline TInt Volume();
    inline TInt Frequency();
	inline TInt Waveform();
    inline void SetFrequency(TInt aFreq);
    inline void SetWaveform(TInt aForm);
    inline TBool StreamReady();	

    void SetVolume(TInt aVol);
        

protected:
    // protected contructor
    CStreamAudioEngine();
    // 2nd phase constructor
    void ConstructL();
    // read the pcm sound data from a file to buffer
    void LoadFileL();    
    // displays error messages
    void ShowErrorMsg(TInt aResourceBuf, TInt aError);

private:
    TInt iForm;                 // waveform type
	TInt iFreq;                 // frequency
    TInt iVolume;               // volume
    TInt iVolStep;      
    TInt iFileSize;             // size of the pcm sound file (and buffer)
    TBool iFileOK;              // indicates if file has been successfully read to buffer 
	TEngineStatus iStatus;      // engine status
    TBool iPlayFile;            // which buffer is currently in use

    TPtr8 iDescBuf;             // a descriptor that encapsulates the two buffers

	TUint8* iGenBuffer;         // buffer for generated pcm waves
    TUint8* iPCMBuffer;         // buffer for pcm sound data (from a file)

	CMdaAudioOutputStream* iStream;
	TMdaAudioDataSettings iSettings;

    CWaveGenerator* iWaveGen;
    CEikonEnv* iEnv;
	};


//
// CWaveGenerator - the wave generator class. 
//
class CWaveGenerator : public CBase
    {
public:    
    enum EWaveform
        {
        ERandom = 0,        
        ESquare
        };
                
    CWaveGenerator();
    ~CWaveGenerator();
    void Generate(EWaveform aForm, TInt aFreq, TDes8& aDescBuf);

private:
    void Random(TDes8& aDescBuf);
    void Square(TInt aFreq, TDes8& aDescBuf);
	inline void WriteToBuf(TDes8& aDescBuf, TInt aOffset, TInt aValue);

private:
    TInt iPhase;
    TInt iSign;
    };


// INLINES

inline TInt CStreamAudioEngine::Volume() { return iVolume; }
inline TInt CStreamAudioEngine::Frequency() { return iFreq; }
inline TInt CStreamAudioEngine::Waveform() { return iForm; }
inline void CStreamAudioEngine::SetFrequency(TInt aFreq) { iFreq = aFreq; }
inline void CStreamAudioEngine::SetWaveform(TInt aForm) { iForm = aForm; }

inline TBool CStreamAudioEngine::StreamReady() 
    { if(iStatus == EEngineReady)
        return ETrue;
      return EFalse; 
    }

// writes 2 bytes to buffer in LSB order
inline void CWaveGenerator::WriteToBuf(TDes8& aDescBuf, TInt aOffset, TInt aValue)
	{
	aDescBuf[aOffset] = (TUint8)(aValue & 0x00ff); 
    aDescBuf[aOffset+1] = (TUint8)((aValue & 0xff00)>>8);
	}

#endif

// eof

⌨️ 快捷键说明

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