123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- ////////////////////////////////////////////////////////////////////////////////
- //
- // 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
- //
- ///////////////////////////////////////////////////////////////////////////////
- //
- // sample.cpp
- //
- // History:
- // 06/23/95 JMI Started.
- //
- // 01/28/97 JMI Added Load(RFile*), Save(char*), and Save(RFile*).
- //
- // 05/09/97 JMI Added GetDuration(), GetTime(), and GetPos() functions.
- //
- //////////////////////////////////////////////////////////////////////////////
- //
- // See CPP for description of this API.
- //
- //////////////////////////////////////////////////////////////////////////////
- #ifndef SAMPLE_H
- #define SAMPLE_H
- //////////////////////////////////////////////////////////////////////////////
- // Headers.
- //////////////////////////////////////////////////////////////////////////////
- #include "System.h"
- // If PATHS_IN_INCLUDES macro is defined, we can utilized relative
- // paths to a header file. In this case we generally go off of our
- // RSPiX root directory. System.h MUST be included before this macro
- // is evaluated. System.h is the header that, based on the current
- // platform (or more so in this case on the compiler), defines
- // PATHS_IN_INCLUDES. Blue.h includes system.h so you can include that
- // instead.
- #ifdef PATHS_IN_INCLUDES
- #include "ORANGE/IFF/iff.h"
- #else
- #include "iff.h"
- #endif // PATHS_IN_INCLUDES
- //////////////////////////////////////////////////////////////////////////////
- // Macros.
- //////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////
- // Types.
- //////////////////////////////////////////////////////////////////////////////
- // Forward declare RSample for typedef.
- class RSample;
- // Handy-dandy typedef.
- typedef RSample* PSAMPLE;
- class RSample
- {
- public:
- // Default constructor.
- RSample();
- // Constructor especial.
- RSample( void *pData, long lBufSize,
- long lSamplesPerSec, short sBitsPerSample, short sNumChannels);
- // Destructor.
- ~RSample();
- ////////////////////////// Querries ///////////////////////////////////////
- public:
- // Returns the reference count. Non-zero == locked, Zero == not locked,
- // Negative == fucked.
- short IsLocked(void) { return m_sRefCnt; }
- // Get the duration of this sample in milliseconds.
- long GetDuration(void)
- {
- return GetTime(m_lBufSize);
- }
- // Get the time in milliseconds indicated by the specified byte position
- // in the sample.
- long GetTime(
- long lPos) // In: Position in bytes.
- {
- return lPos / (m_lSamplesPerSec * m_sNumChannels * m_sBitsPerSample / 8000);
- }
- // Get the position in bytes indicated by the specified time in milliseconds
- // in the sample.
- long GetPos(
- long lTime) // In: Time in milliseconds.
- {
- return lTime * (m_lSamplesPerSec * m_sNumChannels * m_sBitsPerSample / 8000);
- }
-
- ////////////////////////// Methods ////////////////////////////////////////
- public:
- // Reset object. Release sample data and reset variables.
- void Reset(void);
- // Open a file and read the header. Locks the RSample automatically.
- // Returns the size of the file's data on success, negative otherwise.
- long Open(char* pszSampleName, long lReadBufSize);
- // Read the specified amount of data from the open file.
- // Returns amount read on success, negative on failure.
- long Read(long lAmount);
-
- // Close the file opened with Open. Unlocks the RSample automatically.
- // Returns 0 on success.
- short Close(void);
- // Load an entire sample from a file.
- // Returns 0 on success.
- short Load(char* pszSampleName);
- // Same as above, but accepts an open RFile*.
- short Load( // Returns 0 on success.
- RFile* pfile); // Open RFile.
- // Saves entire sample to file specified in RIFF WAVE format.
- short Save( // Returns 0 on success.
- char* pszFileName); // Filename for sample file.
- // Saves entire sample to file specified in RIFF WAVE format.
- short Save( // Returns 0 on success.
- RFile* pfile); // Open RFile for sample.
- // Lock this sample for use. Returns 0 on success.
- short Lock(void);
- // Unlock this sample from use. Returns new reference count.
- short Unlock(void);
- // Convert current sample data from 8 bit unsigned to 16 bit signed.
- // Returns 0 on success.
- short Convert8to16(void);
- ////////////////////////// Internal Methods ///////////////////////////////
- protected:
- // Initialize instantiable members.
- void Init(void);
- // Read WAVE info from m_file.
- // Returns size of sample data on success, negative on error.
- long ReadWaveHeader(void);
- ////////////////////////// Member vars ////////////////////////////////////
- public:
- long m_lBufSize; // Amount of data in CSnd.
- long m_lSamplesPerSec; // Rate of data in buffer.
- short m_sNumChannels; // Number of channels (i.e., 1==mono,
- // 2==stereo).
- short m_sBitsPerSample; // Number of bits per sample.
- void* m_pData; // Buffer used for sample data.
- protected:
- short m_sOwnBuf; // TRUE if play buffer allocated by RSample.
- short m_sRefCnt; // Reference count of locks on this sample's
- // data.
- RIff m_iff; // File stream pointer for reading/streaming.
- /////////////////////// Static members /////////////////////////////////
-
- };
- #endif // SAMPLE_H
- //////////////////////////////////////////////////////////////////////////////
- // EOF
- //////////////////////////////////////////////////////////////////////////////
|