123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- ////////////////////////////////////////////////////////////////////////////////
- //
- // Copyright 2016 RWS Inc, All Rights Reserved
- //
- // This program is free software; you can redistribute it and/or modify
- // it under the terms of version 2 of the GNU General Public License as published by
- // the Free Software Foundation
- //
- // This program 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 this program; if not, write to the Free Software Foundation, Inc.,
- // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- //
- // MixBuf.h
- #ifndef MIXBUF_H
- #define MIXBUF_H
- ///////////////////////////////////////////////////////////////////////////////
- // Macros.
- ///////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- // Types.
- ///////////////////////////////////////////////////////////////////////////////
- // Forward declare class for handy-dandy typedef.
- class RMixBuf;
- // Handy-dandy typedef.
- typedef RMixBuf* PMIXBUF;
- // Class definition.
- class RMixBuf
- {
- public: // <Con|De>struction.
- // Default constructor.
- RMixBuf();
- // Constructor Especial.
- RMixBuf( // Returns whatever it is a constructor returns.
- UCHAR* pu8Dst, // In: Destination buffer.
- ULONG ulSize); // In: Size of destination buffer in bytes.
- // Destructor.
- ~RMixBuf();
- public: // Methods.
- // Silence buffer.
- void Silence(void);
-
- // Set size of mix buffer in bytes. (Allocates buffer).
- // Returns 0 on success.
- short SetSize(ULONG ulSize);
- // Set the destination buffer.
- void SetDest(
- UCHAR* pu8Dst, // In: Destination buffer.
- ULONG ulSize); // In: Size of destination buffer in bytes.
- // Mix data in.
- // Returns 0 on success.
- short Mix( ULONG ulStartPos,
- U8* pu8Data,
- ULONG ulSize,
- long lSampleRate,
- long lBitsPerSample,
- long lNumChannels,
- UCHAR ucVolume = UCHAR(255),
- UCHAR ucVol2 = UCHAR(255) );
- // Prepare for destination. If necessary, converts to destination format.
- void PrepareForDest(void);
- public: // Querries.
-
- // Get ptr to destination data.
- void* GetDstData(void) { return m_pu8Dst; }
- // Get ptr to mix data.
- void* GetMixData(void) { return m_pu8Mix; }
- // Get size of destination buffer in bytes.
- ULONG GetDstSize(void) { return m_ulDstSize; }
- // Get size of mix buffer in bytes.
- ULONG GetMixSize(void) { return m_ulMixSize; }
- // Returns number of RMixBufs allocated.
- static short Num(void) { return ms_sNumBufs; }
- public: // Statics.
- // Sets the global volume for mixed sounds:
- static void SetVolume(UCHAR ucVolume)
- {
- ms_ucGlobalVolume = ucVolume;
- }
- // Reads the current global volume for mixed sounds:
- static UCHAR GetVolume()
- {
- return ms_ucGlobalVolume;
- }
- // Allows user to set the cut off volume for mixing sound:
- static void SetCutOff(short sVolume)
- {
- if ( (sVolume >= 0) && (sVolume < 256) )
- {
- ms_sCutOffVolume = sVolume;
- }
- }
- protected: // Internal use.
- // Intialize members.
- void Init(void);
- // Free dynamic data and re-init.
- void Reset(void);
- protected: // Members.
- U8* m_pu8Mix; // Mix buffer.
- U8* m_pu8Dst; // Destination buffer.
- short m_sOwnMixBuf; // TRUE if RMixBuf allocated the mix buffer.
- ULONG m_ulMixSize; // Size of mix buffer in bytes.
- ULONG m_ulDstSize; // Size of dst buffer in bytes.
- static short ms_sNumBufs; // Number of RMixBufs allocated.
- static UCHAR ms_ucGlobalVolume;// Scale all mixes relative to this
-
- public: // It is safe to change these.
- short m_sInUse; // TRUE if in use, FALSE otherwise.
- static long ms_lSampleRate; // Sample rate for audio
- // playback/mix.
-
- static long ms_lSrcBitsPerSample; // Sample size in bits for sample data.
- // 0 for no preference.
- static long ms_lMixBitsPerSample; // Sample size in bits for mixing.
- static long ms_lDstBitsPerSample; // Sample size in bits for Blue data.
- static long ms_lNumChannels; // Number of channels (mono
- // or stereo).
- static short ms_sCutOffVolume; // when to not mix samples...
- };
- //////////////////////////////////////////////////////////////////////////////
- //
- // Build table for dynamic volume adjustment (DVA) - now available to the
- // the outside world
- //
- //////////////////////////////////////////////////////////////////////////////
- // Cutting back on the number of volume levels is strictly to save memory
- #define DVA_RESOLUTION 1 // significant volume change in 0-255
- #define DVA_SHIFT 0 // must match the resolution in shift bits
- #define DVA_SIZE (256>>DVA_SHIFT) // size of tables
- #define DVA_LOW_OFFSET (256 * DVA_SIZE * 2)
- class CDVA // a complete dummy
- {
- public:
- //////////////////////////////////////////////////////////////////////////////
- // Allow use of mixing volume for other applications:
- // A level of 255 is identity.
- //////////////////////////////////////////////////////////////////////////////
- inline UCHAR ScaleByte(UCHAR ucByte,UCHAR ucLevel)
- {
- return UCHAR(CDVA::ms_asHighByte[DVA_SIZE +
- (ucLevel>>DVA_SHIFT)][ucByte]);
- }
- // More efficient for a block of data scaled the same:
- inline void ScaleBytes(short sNumBytes,UCHAR* pucBytesIn,
- UCHAR* pucBytesOut,UCHAR ucLevel)
- {
- ASSERT(pucBytesIn);
- ASSERT(pucBytesOut);
- // Unsigned, always true. --ryan.
- //ASSERT(ucLevel < 256);
- short* psTable = CDVA::ms_asHighByte[DVA_SIZE + (ucLevel>>DVA_SHIFT)];
- short i;
- for (i=0;i < sNumBytes;i++)
- {
- pucBytesOut[i] = UCHAR(psTable[pucBytesIn[i]]);
- }
- }
- // we can also scale 16-bit values, but this is not yet accessible to the user.
- //----------------------------------------------------------------------
- CDVA();
- ~CDVA(){}; // nothing to do....
- //----------------------------------------------------------------------
- // To save on registers, make this the same array:
- static short ms_asHighByte[DVA_SIZE * 2][256]; // for 16-bit sound
- };
- #endif // MIXBUF_H
- ///////////////////////////////////////////////////////////////////////////////
- // EOF
- ///////////////////////////////////////////////////////////////////////////////
|