/******************************************************************************\ * Copyright (c) 2004-2009 * * Author(s): * Volker Fischer, Alexander Kurpiers * * This code is based on the Open-Source sound interface implementation of * the Dream DRM Receiver project. * \******************************************************************************/ #if !defined(_SOUND_H__9518A621345F78_3634567_8C0D_EEBF182CF549__INCLUDED_) #define _SOUND_H__9518A621345F78_3634567_8C0D_EEBF182CF549__INCLUDED_ #include #include #include #include #include #include #include #include #include "util.h" #include "soundbase.h" #include "global.h" #if WITH_SOUND # define ALSA_PCM_NEW_HW_PARAMS_API # define ALSA_PCM_NEW_SW_PARAMS_API # include #endif /* Definitions ****************************************************************/ #define NUM_IN_OUT_CHANNELS 2 // always stereo // the number of periods is critical for latency #define NUM_PERIOD_BLOCKS_IN 2 #define NUM_PERIOD_BLOCKS_OUT 2 #define MAX_SND_BUF_IN 200 #define MAX_SND_BUF_OUT 200 /* Classes ********************************************************************/ class CSound : public CSoundBase { public: CSound ( void (*fpNewCallback) ( CVector& psData, void* arg ), void* arg ) : #if WITH_SOUND CSoundBase ( fpNewCallback, arg ), rhandle ( NULL ), phandle ( NULL ), iCurPeriodSizeIn ( NUM_PERIOD_BLOCKS_IN ), iCurPeriodSizeOut ( NUM_PERIOD_BLOCKS_OUT ), bChangParamIn ( true ), bChangParamOut ( true ) {} #else CSoundBase ( fpNewCallback, arg ) {} #endif virtual ~CSound() { Close(); } // not implemented yet, always return one device and default string int GetNumDev() { return 1; } std::string GetDeviceName ( const int iDiD ) { return "wave mapper"; } int SetDev ( const int iNewDev ) {} // dummy int GetDev() { return 0; } #if WITH_SOUND void SetInNumBuf ( int iNewNum ); int GetInNumBuf() { return iCurPeriodSizeIn; } void SetOutNumBuf ( int iNewNum ); int GetOutNumBuf() { return iCurPeriodSizeOut; } virtual void Init ( const int iNewStereoBufferSize ) { // init base class CSoundBase::Init ( iNewStereoBufferSize ); // set internal buffer size for read and write iBufferSizeIn = iNewStereoBufferSize / NUM_IN_OUT_CHANNELS; // mono size iBufferSizeOut = iNewStereoBufferSize / NUM_IN_OUT_CHANNELS; // mono size InitRecording(); InitPlayback(); } virtual bool Read ( CVector& psData ); virtual bool Write ( CVector& psData ); virtual void Close(); protected: void InitRecording(); void InitPlayback(); snd_pcm_t* rhandle; snd_pcm_t* phandle; bool SetHWParams ( snd_pcm_t* handle, const int iBufferSizeIn, const int iNumPeriodBlocks ); int iBufferSizeOut; int iBufferSizeIn; bool bChangParamIn; int iCurPeriodSizeIn; bool bChangParamOut; int iCurPeriodSizeOut; #else // dummy definitions void SetInNumBuf ( int iNewNum ) {} int GetInNumBuf() { return 1; } void SetOutNumBuf ( int iNewNum ) {} int GetOutNumBuf() { return 1; } virtual void Init ( const int iNewStereoBufferSize ) { CSoundBase::Init ( iNewStereoBufferSize ); } virtual bool Read ( CVector& psData ) { printf ( "no sound!" ); return false; } virtual bool Write ( CVector& psData ) { printf ( "no sound!" ); return false; } virtual void Close() {} #endif }; #endif // !defined(_SOUND_H__9518A621345F78_3634567_8C0D_EEBF182CF549__INCLUDED_)