00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "PCMAudioStream.hxx"
00023 #include "AudioFile.hxx"
00024 #include "Assert.hxx"
00025
00026 #ifdef CLAM_DOUBLE
00027 #define CLAM_sf_read sf_readf_double
00028 #define CLAM_sf_write sf_writef_double
00029 #else
00030 #define CLAM_sf_read sf_readf_float
00031 #define CLAM_sf_write sf_writef_float
00032 #endif
00033
00034 namespace CLAM
00035 {
00036
00037 namespace AudioCodecs
00038 {
00039 PCMAudioStream::PCMAudioStream()
00040 : mFileHandle( NULL )
00041 {
00042 mNativeFileParams.format = 0;
00043 }
00044
00045 PCMAudioStream::PCMAudioStream( const AudioFile& file )
00046 : mFileHandle( NULL )
00047 {
00048 SetFOI( file );
00049
00050 }
00051
00052 PCMAudioStream::~PCMAudioStream()
00053 {
00054 if ( mFileHandle )
00055 {
00056 sf_close( mFileHandle );
00057 }
00058 }
00059
00060 void PCMAudioStream::AudioFileToNative( const AudioFile& file)
00061 {
00062 mName = file.GetLocation();
00063 mNativeFileParams.channels = file.GetHeader().GetChannels();
00064 mNativeFileParams.samplerate = (int) file.GetHeader().GetSampleRate();
00065 mNativeFileParams.format = file.GetHeader().GetFormat() | file.GetHeader().GetEncoding() | file.GetHeader().GetEndianess();
00066 }
00067
00068 void PCMAudioStream::SetFOI( const AudioFile& file )
00069 {
00070 Dispose();
00071 AudioFileToNative(file);
00072 SetChannels( mNativeFileParams.channels );
00073 }
00074
00075 void PCMAudioStream::PrepareReading()
00076 {
00077 mFileHandle = sf_open( mName.c_str(),
00078 SFM_READ,
00079 &mNativeFileParams );
00080
00081 CLAM_ASSERT( mFileHandle != NULL,
00082 "Cannot open file for reading!!!" );
00083 MarkAllChannelsAsConsumed();
00084 mEOFReached = false;
00085 }
00086
00087 void PCMAudioStream::PrepareWriting()
00088 {
00089
00090 mFileHandle = sf_open( mName.c_str(),
00091 SFM_WRITE,
00092 &mNativeFileParams );
00093
00094 CLAM_ASSERT( mFileHandle != NULL,
00095 "Cannot open file for writing!!!" );
00096
00097 MarkAllChannelsAsProduced();
00098 }
00099
00100 void PCMAudioStream::PrepareReadWrite()
00101 {
00102 mFileHandle = sf_open( mName.c_str(),
00103 SFM_RDWR,
00104 &mNativeFileParams );
00105
00106 CLAM_ASSERT( mFileHandle != NULL,
00107 "Cannot open file for reading/writing!!!" );
00108
00109 MarkAllChannelsAsConsumed();
00110 MarkAllChannelsAsProduced();
00111 mEOFReached = false;
00112 }
00113
00114 void PCMAudioStream::Dispose()
00115 {
00116 if ( mFileHandle )
00117 {
00118 sf_close( mFileHandle );
00119 mFileHandle = NULL;
00120 }
00121 }
00122
00123 void PCMAudioStream::DiskToMemoryTransfer()
00124 {
00125 int channelCount = mNativeFileParams.channels;
00126
00127 sf_count_t framesRead = CLAM_sf_read( mFileHandle,
00128 mInterleavedData.GetPtr(),
00129 mFramesToRead );
00130
00131 mFramesLastRead = (TSize)framesRead;
00132
00133 if ( framesRead == 0 )
00134 {
00135 mEOFReached = true;
00136 return;
00137 }
00138
00139 if ( framesRead < mFramesToRead )
00140 {
00141
00142
00143 const TData* end = mInterleavedData.GetPtr() + mInterleavedData.Size();
00144
00145 for ( TData* i = mInterleavedData.GetPtr() + ( framesRead * channelCount );
00146 i != end;
00147 i++ )
00148 *i = 0.0;
00149
00150 mEOFReached = true;
00151 }
00152 }
00153
00154
00155 void PCMAudioStream::MemoryToDiskTransfer()
00156 {
00157 sf_count_t samplesWritten = CLAM_sf_write( mFileHandle,
00158 mInterleavedDataOut.GetPtr(),
00159 mFramesToWrite );
00160
00161 CLAM_DEBUG_ASSERT( samplesWritten == mFramesToWrite,
00162 "Could not write all samples to disk!" );
00163 }
00164
00165 }
00166 }
00167