view src/audio/symbian/streamplayer.h @ 4001:6831b8723a85 SDL-1.2

Don't initialize the audio buffer passed to the application's audio callback, since they are expected to entirely fill it with data or silence. For legacy apps that might expect the buffer to already have silence and thus may not fill the buffer in the callback, there's an environment variable to expose the old behaviour. Fixes Bugzilla #416.
author Ryan C. Gordon <icculus@icculus.org>
date Thu, 05 Jul 2007 02:24:36 +0000
parents e85e65aec22f
children
line wrap: on
line source

#ifndef STREAMPLAYER_H
#define STREAMPLAYER_H

#include<MdaAudioOutputStream.h>

const TInt KSilenceBuffer = 256;

class MStreamObs
    {
    public:
    	enum 
    	{
    	EInit, 
    	EPlay,
    	EWrite,
    	EClose,	
    	};
        virtual void Complete(TInt aState, TInt aError) = 0;
    };

class MStreamProvider
	{
	public:
		virtual TPtrC8 Data() = 0;	
	};

NONSHARABLE_CLASS(CStreamPlayer) : public CBase, public MMdaAudioOutputStreamCallback
	{
	public:
		CStreamPlayer(MStreamProvider& aProvider, MStreamObs& aObs);
		~CStreamPlayer();
		void ConstructL();
		
		static TInt ClosestSupportedRate(TInt aRate);
		
		TInt OpenStream(TInt aRate, TInt aChannels, TUint32 aType = KMMFFourCCCodePCM16);
		
		void SetVolume(TInt aNew);
		TInt Volume() const;
		TInt MaxVolume() const;
		
		void Stop();
		void Start();
		void Open();
		void Close();
		
		TBool Playing() const;
		TBool Closed() const;
		
	private:

		void MaoscOpenComplete(TInt aError) ;
		void MaoscBufferCopied(TInt aError, const TDesC8& aBuffer);
		void MaoscPlayComplete(TInt aError);
	
	private:
		void Request();
		void SetCapsL();

	private:
		MStreamProvider& iProvider;
		MStreamObs& iObs;	
		TInt iVolume;
	
		CMdaAudioOutputStream* iStream;
	
		TInt iRate;
		TInt iChannels;
		TUint32 iType;
		
		enum 
			{
				ENone = 0,
				EInited = 0x1,
				EStarted = 0x2,
				EStopped = 0x4,
				EVolumeChange = 0x8,
				EDied		  = 0x10
			};
		
		TInt iState;
		TBuf8<KSilenceBuffer> iSilence;
		TPtrC8 iPtr;
	
	};


#endif