/* =========================================================================== Return to Castle Wolfenstein single player GPL Source Code Copyright (C) 1999-2010 id Software LLC, a ZeniMax Media company. This file is part of the Return to Castle Wolfenstein single player GPL Source Code (“RTCW SP Source Code”). RTCW SP Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. RTCW SP Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with RTCW SP Source Code. If not, see . In addition, the RTCW SP Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the RTCW SP Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ /* * This is the hardware abstraction layer. Right now, it's not even * a little abstract, because I've got MS code in here for dealing with * DirectSound and .wav files, but it will be very very soon * */ #ifndef _idAudioHardware_h_ #define _idAudioHardware_h_ //#define DIRECTSOUND_VERSION 0x0700 // we will soon not be including these at all #include "../mssdk/include/dsound.h" #include #include #include // promise #define MAX_CHANNELS 32 /* general extended waveform format structure Use this for all NON PCM formats (information common to all formats) */ typedef struct { word wFormatTag; /* format type */ word nChannels; /* number of channels (i.e. mono, stereo...) */ dword nSamplesPerSec; /* sample rate */ dword nAvgBytesPerSec; /* for buffer estimation */ word nBlockAlign; /* block size of data */ word wBitsPerSample; /* Number of bits per sample of mono data */ word cbSize; /* The count in bytes of the size of extra information (after cbSize) */ } waveformatex; /* RIFF chunk information data structure */ typedef struct { FOURCC ckid; /* chunk ID */ dword cksize; /* chunk size */ FOURCC fccType; /* form type or list type */ dword dwDataOffset; /* offset of data portion of chunk */ } mminfo; //----------------------------------------------------------------------------- // Classes used by this header //----------------------------------------------------------------------------- class idAudioHardware; class idAudioBuffer; class idStreamingBuffer; class idWavefile; //----------------------------------------------------------------------------- // Typing macros //----------------------------------------------------------------------------- #define WAVEFILE_READ 1 #define WAVEFILE_WRITE 2 //----------------------------------------------------------------------------- // Miscellaneous helper functions //----------------------------------------------------------------------------- #define SAFE_DELETE( p ) { if ( p ) { delete ( p ); ( p ) = NULL; } } #define SAFE_DELETE_ARRAY( p ) { if ( p ) { delete[] ( p ); ( p ) = NULL; } } #define SAFE_RELEASE( p ) { if ( p ) { ( p )->Release(); ( p ) = NULL; } } //----------------------------------------------------------------------------- // Name: class idAudioHardware // Desc: //----------------------------------------------------------------------------- class idAudioHardware { protected: LPDIRECTSOUND8 m_pDS; bool eax; LPDIRECTSOUNDBUFFER pDSBPrimary; LPKSPROPERTYSET pEAXListener; public: idAudioHardware(); ~idAudioHardware(); int Initialize( dword dwCoopLevel, dword dwPrimaryChannels, dword dwPrimaryFreq, dword dwPrimaryBitRate ); inline LPDIRECTSOUND GetDirectSound() { return m_pDS; } int SetPrimaryBufferFormat( dword dwPrimaryChannels, dword dwPrimaryFreq, dword dwPrimaryBitRate ); int Get3DListenerInterface( LPDIRECTSOUND3DLISTENER* ppDSListener ); bool GetEAX( LPDIRECTSOUND3DBUFFER genBuf ); int Create( idAudioBuffer** ppSound, const char* strWaveFileName, dword dwCreationFlags = 0, GUID guid3DAlgorithm = GUID_NULL, dword dwNumBuffers = 1, dword dwMaxNumBuffers = MAX_CHANNELS ); int CreateFromMemory( idAudioBuffer** ppSound, byte* pbData, ulong ulDataSize, waveformatex *pwfx, dword dwCreationFlags = 0, GUID guid3DAlgorithm = GUID_NULL, dword dwNumBuffers = 1 ); int CreateStreaming( idStreamingBuffer** ppStreamingSound, const char* strIntroWaveFileName, const char* strWaveFileName, dword dwCreationFlags, GUID guid3DAlgorithm, bool useNotification, dword dwNotifyCount, dword dwNotifySize, HANDLE hNotifyEvent ); }; //----------------------------------------------------------------------------- // Name: class idAudioBuffer // Desc: Encapsulates functionality of a DirectSound buffer. //----------------------------------------------------------------------------- class idAudioBuffer { protected: LPDIRECTSOUNDBUFFER* m_apDSBuffer; LPDIRECTSOUND3DBUFFER* m_pDS3DBuffer; // 3D sound buffer dword m_dwDSBufferSize; idWavefile* m_pWaveFile; idWavefile* m_qWaveFile; dword m_dwNumBuffers; dword m_dwMaxNumBuffers; int RestoreBuffer( LPDIRECTSOUNDBUFFER pDSB, bool* pbWasRestored ); public: idAudioBuffer( LPDIRECTSOUNDBUFFER* apDSBuffer, dword dwDSBufferSize, dword dwNumBuffers, dword dwMaxNumBuffers, idWavefile* pWaveFile ); virtual ~idAudioBuffer(); void Get3DBufferInterfaces( float minDistance = 1.0f, float maxDistance = 400.0f ); int FillBufferWithSound( LPDIRECTSOUNDBUFFER pDSB, bool bRepeatWavIfBufferLarger ); void SetRange( int index, float min, float max ); void SetPosition( int index, float x, float y, float z ); void SetVelocity( int index, float x, float y, float z ); void SetVolume( int index, float volume ); LPDIRECTSOUNDBUFFER GetFreeBuffer(); LPDIRECTSOUNDBUFFER GetBuffer( dword dwIndex ); LPDIRECTSOUND3DBUFFER Get3DBuffer( dword dwIndex ); int Play( dword index, dword dwPriority, dword dwFlags ); int Pause( dword index ); int Stop( dword index ); int Reset(); bool IsSoundPlaying(); bool AllChannelsPlaying(); int GetFreeIndex(); void Make2D( dword index ); int GetNumBuffers() { return m_dwNumBuffers; } idStr *name; int entnum[MAX_CHANNELS]; int entchannel[MAX_CHANNELS]; int flags[MAX_CHANNELS]; }; //----------------------------------------------------------------------------- // Name: class idStreamingBuffer // Desc: Encapsulates functionality to play a wave file with DirectSound. // The Create() method loads a chunk of wave file into the buffer, // and as sound plays more is written to the buffer by calling // HandleWaveStreamNotification() whenever hNotifyEvent is signaled. //----------------------------------------------------------------------------- class idStreamingBuffer : public idAudioBuffer { protected: dword m_dwLastPlayPos; dword m_dwPlayProgress; dword m_dwNotifySize; dword m_dwNextWriteOffset; dword m_dwNextEvent; bool m_bFillNextNotificationWithSilence; bool m_bUsingNotification; idWavefile* m_qWaveFile; public: idStreamingBuffer( LPDIRECTSOUNDBUFFER pDSBuffer, dword dwDSBufferSize, idWavefile* pWaveFile, idWavefile* oWaveFile, bool useNotification, dword dwNotifySize ); ~idStreamingBuffer(); int HandleWaveStreamNotification(); int Reset(); bool UsingNotification() { return m_bUsingNotification; } int attenuation; bool looping; bool in3D; }; //----------------------------------------------------------------------------- // Name: class idWavefile // Desc: Encapsulates reading or writing sound data to or from a wave file //----------------------------------------------------------------------------- class idWavefile { public: waveformatex* m_pwfx; // Pointer to waveformatex structure fileHandle_t m_hmmio; // MM I/O handle for the WAVE mminfo m_ck; // Multimedia RIFF chunk mminfo m_ckRiff; // Use in opening a WAVE file dword m_dwSize; // The size of the wave file dword m_dwFlags; bool m_bIsReadingFromMemory; byte* m_pbData; byte* m_pbDataCur; ulong m_ulDataSize; protected: int ReadMMIO(); public: idWavefile(); ~idWavefile(); int Open( const char* strFileName, waveformatex* pwfx, dword dwFlags ); int OpenFromMemory( byte* pbData, ulong ulDataSize, waveformatex* pwfx, dword dwFlags ); int Close(); int Read( byte* pBuffer, dword dwSizeToRead, dword* pdwSizeRead ); dword GetSize(); int ResetFile(); waveformatex* GetFormat() { return m_pwfx; }; }; #endif // _idAudioHardware_h_