// BASNDDA.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

// Started by JL, July 1996
// Sound data header
//

#if !defined(__BASNDDA_H__)
#define __BASNDDA_H__

#if !defined(__S32STD_H__)
#include <s32std.h>
#endif

const TInt KSoundDataChunkLength=800;
const TUid KSoundDataV1Uid={268435538};
const TInt KAlawSampleRate=8000;
const TInt KAlawSampleTime=1000000/KAlawSampleRate;	// in micro seconds

//
// class CSoundData
//

class RFile;
class CBulkData;
class CSoundDataCoord;

class MExternalizeable
	{
public:
	virtual void ExternalizeL(RWriteStream& aStream) const =0;
	virtual void InternalizeL(RReadStream& aStream) =0;
	};

class CSoundData : public CBase
	{
public:
	IMPORT_C static CSoundData* NewL();
	IMPORT_C static CSoundData* NewL(const CStreamStore& aStore,TStreamId aStreamId);
	IMPORT_C static CSoundData* NewL(RFile& aFile,TInt aStart);
	IMPORT_C ~CSoundData();
//
	inline TUid Compression() const;
	inline TInt Repeat() const;
	inline TInt Volume() const;
	inline TTimeIntervalMicroSeconds32 TrailingSilence() const;
	inline TInt SampleLength() const;
//
	IMPORT_C void SetCompressionL(TUid aUid);
	inline void SetRepeat(TInt aRepeat);
	inline void SetVolume(TInt aVolume);
	inline void SetTrailingSilence(TTimeIntervalMicroSeconds32 aMicroSecond);
//
	IMPORT_C void ReadL(TDes8& aAlaw);
//
	IMPORT_C void UseSeekIndexL();
	IMPORT_C TInt TellL() const;
	IMPORT_C TBool SeekL(TInt aPos);
//
	IMPORT_C void TruncateL(TInt aLength);
	IMPORT_C void PrepareToWriteL();
	IMPORT_C void WriteL(TDes8& aAlaw);
	IMPORT_C void CommitWriteL();
	IMPORT_C void CommitWriteWithTruncationL();
	IMPORT_C void AbortWrite();
	IMPORT_C TBool IsWriting() const;
//
	IMPORT_C void DetachL() const;
	IMPORT_C void ExternalizeL(RWriteStream& aStream) const;
	IMPORT_C void SaveL(RFile& aFile,TBool aUseNewFile=EFalse);
	IMPORT_C void CommitHeaderL() const;
//
	IMPORT_C static TTimeIntervalMicroSeconds AlawBytesToMicroSeconds(TInt aBytes);
	IMPORT_C static TInt MicroSecondsToAlawBytes(const TTimeIntervalMicroSeconds& aMicros);
private:
	class THeader : public MExternalizeable
		{
	public:
		void ExternalizeL(RWriteStream& aStream) const;
		void InternalizeL(RReadStream& aStream);
	public:
		TInt iSampleLength;
		TUid iCompression;
		TInt iRepeat;
		TInt iVolume;
		TTimeIntervalMicroSeconds32 iTrailingSilence;
		};
private:
    IMPORT_C CSoundData();
	static CSoundData* NewL(CBulkData* aData);
	inline CSoundDataCoord& Coord() const;
	inline CBulkData& Data() const;
private:
	THeader iHeader;
	CBulkData* iData;
	CSoundDataCoord* iCoord;
	};

inline TUid CSoundData::Compression() const
	{return iHeader.iCompression;}
inline TInt CSoundData::Repeat() const
	{return iHeader.iRepeat;}
inline TInt CSoundData::Volume() const
	{return iHeader.iVolume;}
inline TTimeIntervalMicroSeconds32 CSoundData::TrailingSilence() const
	{return iHeader.iTrailingSilence;}
inline TInt CSoundData::SampleLength() const
	{return iHeader.iSampleLength;}
inline void CSoundData::SetRepeat(TInt aRepeat)
	{iHeader.iRepeat=aRepeat;}
inline void CSoundData::SetVolume(TInt aVolume)
	{iHeader.iVolume=aVolume;}
inline void CSoundData::SetTrailingSilence(TTimeIntervalMicroSeconds32 aTrailingSilence)
	{iHeader.iTrailingSilence=aTrailingSilence;}

#endif
