AudioFile.cxx

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2001-2004 MUSIC TECHNOLOGY GROUP (MTG)
00003  *                         UNIVERSITAT POMPEU FABRA
00004  *
00005  *
00006  * This program is free software; you can redistribute it and/or modify
00007  * it under the terms of the GNU General Public License as published by
00008  * the Free Software Foundation; either version 2 of the License, or
00009  * (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software
00018  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019  *
00020  */
00021 
00022 #include "AudioFile.hxx"
00023 #include "Assert.hxx"
00024 #include "PCMCodec.hxx"
00025 #if USE_OGGVORBIS == 1
00026 #  include "OggVorbisCodec.hxx"
00027 #endif
00028 
00029 #if USE_MAD == 1
00030 #  include "MpegCodec.hxx"
00031 #endif
00032 
00033 namespace CLAM
00034 {
00035         AudioFile::AudioFile()
00036                 : mCodec( EAudioFileCodec::eUnknown )
00037                 , mActiveCodec( NULL )
00038         {
00039         }
00040 
00041         AudioFile::AudioFile( const AudioFile& obj )
00042         {
00043                 mLocation = obj.mLocation;
00044                 mActiveCodec = obj.mActiveCodec;
00045                 mCodec = obj.mCodec;
00046                 mHeaderData = obj.mHeaderData;
00047                 mTextDescriptors = obj.mTextDescriptors;
00048         }
00049 
00050         const AudioFile& AudioFile::operator=( const AudioFile& obj )
00051         {
00052                 mLocation = obj.mLocation;
00053                 mActiveCodec = obj.mActiveCodec;
00054                 mCodec = obj.mCodec;
00055                 mHeaderData = obj.mHeaderData;
00056                 mTextDescriptors = obj.mTextDescriptors;
00057                 return *this;
00058         }
00059 
00060         AudioFile::~AudioFile()
00061         {
00062         }
00063         
00064         void AudioFile::ResolveCodec()
00065         {
00066                 mActiveCodec = NULL;
00067 
00068                 const std::string &location = mLocation;
00069                 if ( !AudioCodecs::Codec::FileExists( location ) )
00070                 {               
00071                         mCodec = EAudioFileCodec::eUnknown;
00072                         return;
00073                 }
00074 
00075                 if ( AudioCodecs::PCMCodec::Instantiate().IsReadable( location ) )
00076                 {
00077                         mCodec = EAudioFileCodec::ePCM;
00078                         mActiveCodec = &AudioCodecs::PCMCodec::Instantiate();
00079                 }
00080 #if USE_OGGVORBIS == 1
00081                 else if ( AudioCodecs::OggVorbisCodec::Instantiate().IsReadable( location ) )
00082                 {
00083                         mCodec = EAudioFileCodec::eOggVorbis;
00084                         mActiveCodec = &AudioCodecs::OggVorbisCodec::Instantiate();             
00085                 }
00086 #endif          
00087 #if USE_MAD == 1
00088                 else if ( AudioCodecs::MpegCodec::Instantiate().IsReadable( location ) )
00089                 {
00090                         mCodec = EAudioFileCodec::eMpeg;
00091                         mActiveCodec = &AudioCodecs::MpegCodec::Instantiate();
00092                 }
00093 #endif
00094                 else
00095                         mCodec = EAudioFileCodec::eUnknown;             
00096         }
00097 
00098         bool AudioFile::SetHeader( const AudioFileHeader& newHeader )
00099         {
00100                 mHeaderData.AddAll();
00101                 mHeaderData.UpdateData();
00102                 
00103                 if ( !newHeader.HasSampleRate() )
00104                         return false;
00105                 else
00106                         mHeaderData.SetSampleRate( newHeader.GetSampleRate() );
00107 
00108                 if ( !newHeader.HasChannels() )
00109                         mHeaderData.SetChannels( 1 );
00110                 else
00111                         mHeaderData.SetChannels( newHeader.GetChannels() );
00112 
00113                 if ( !newHeader.HasFormat() )
00114                         return false;
00115 
00116                 if ( newHeader.GetFormat() < EAudioFileFormat::eVorbisMk1 )
00117                 {
00118                         mCodec = EAudioFileCodec::ePCM;
00119                         mActiveCodec = &AudioCodecs::PCMCodec::Instantiate();
00120                 }
00121                 else if ( newHeader.GetFormat() == EAudioFileFormat::eVorbisMk1 )
00122                 {
00123                         mCodec = EAudioFileCodec::eOggVorbis;
00124 #if USE_OGGVORBIS==1            
00125                         mActiveCodec= &AudioCodecs::OggVorbisCodec::Instantiate();
00126 #endif          
00127                 }
00128                 else
00129                         CLAM_ASSERT( false, "The Enum contained and invalid value!" );
00130 
00131                 if ( !newHeader.HasFormat() )
00132                 {
00133                         if ( mCodec == EAudioFileCodec::ePCM )
00134                         {
00135                                 if ( mHeaderData.GetFormat() == EAudioFileFormat::eWAV )
00136                                         mHeaderData.SetEncoding( EAudioFileEncoding::ePCM_24 );
00137                                 else if ( mHeaderData.GetFormat() == EAudioFileFormat::eAIFF )
00138                                         mHeaderData.SetEncoding( EAudioFileEncoding::ePCM_24 );
00139                                 else
00140                                         return false;
00141                         }
00142                         else if ( mCodec == EAudioFileCodec::eOggVorbis )
00143                         {
00144                                 mHeaderData.SetEncoding( EAudioFileEncoding::eDefault );
00145                         }
00146                         else
00147                                 return false;
00148                 }
00149                 else
00150                         mHeaderData.SetFormat( newHeader.GetFormat() );
00151 
00152                 if ( !newHeader.HasEndianess() )
00153                         mHeaderData.SetEndianess( EAudioFileEndianess::eDefault );
00154                 else
00155                         mHeaderData.SetEndianess( newHeader.GetEndianess() );
00156                 
00157                 return true;
00158         }
00159 
00160         EAudioFileCodec AudioFile::GetCodec() const
00161         {
00162                 return mCodec;
00163         }
00164 
00165         bool AudioFile::IsValid() const
00166         {
00167                 return mActiveCodec == NULL;
00168         }
00169 
00170         bool AudioFile::IsReadable() const
00171         {
00172                 return mActiveCodec && mActiveCodec->IsReadable(mLocation);
00173         }
00174 
00175         bool AudioFile::IsWritable() const
00176         {
00177                 return mActiveCodec && mActiveCodec->IsWritable(mLocation, mHeaderData );
00178         }
00179 
00180         AudioCodecs::Stream*  AudioFile::GetStream()
00181         {
00182                 if ( !mActiveCodec ) return 0;
00183                 return mActiveCodec->GetStreamFor( *this );
00184         }
00185 
00186         void AudioFile::ActivateCodec()
00187         {
00188                 if (!mActiveCodec) return;
00189                 mActiveCodec->RetrieveHeaderData( mLocation, mHeaderData );
00190                 mActiveCodec->RetrieveTextDescriptors( mLocation, mTextDescriptors );                           
00191         }
00192                 
00193         void AudioFile::ResetHeaderData()
00194         {
00195                 mHeaderData.RemoveAll();
00196                 mHeaderData.UpdateData();
00197         }
00198 
00199         /* =============================================================== */
00200 
00201         void AudioFileSource::OpenExisting(const std::string &location)
00202         {
00203                 mLocation = location;
00204                 ResolveCodec();
00205                 ActivateCodec();
00206                 if ( mCodec == EAudioFileCodec::eUnknown )
00207                         ResetHeaderData();
00208         }
00209 
00210         /* =============================================================== */
00211 
00212         bool AudioFileTarget::CreateNew(const std::string &location,
00213                         const AudioFileHeader &header)
00214         {
00215                 mLocation = location;
00216                 return SetHeader(header);
00217         }
00218 
00219 }
00220 

Generated on Tue Jun 19 20:34:52 2007 for CLAM-Development by  doxygen 1.5.2