Cinder

  • Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • Examples
  • File List
  • File Members

include/cinder/audio/SourceFileWindowsMedia.h

Go to the documentation of this file.
00001 /*
00002  Copyright (c) 2009, The Barbarian Group
00003  All rights reserved.
00004 
00005  Redistribution and use in source and binary forms, with or without modification, are permitted provided that
00006  the following conditions are met:
00007 
00008     * Redistributions of source code must retain the above copyright notice, this list of conditions and
00009     the following disclaimer.
00010     * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
00011     the following disclaimer in the documentation and/or other materials provided with the distribution.
00012 
00013  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
00014  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00015  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
00016  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
00017  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00018  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00019  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00020  POSSIBILITY OF SUCH DAMAGE.
00021 */
00022 
00023 #pragma once
00024 
00025 #include "cinder/Cinder.h"
00026 #include "cinder/audio/Io.h"
00027 #include "cinder/Buffer.h"
00028 
00029 #include <Wmsdk.h>
00030 #include <windows.h>
00031 #undef min
00032 #undef max
00033 
00034 
00035 namespace cinder { namespace audio {
00036 
00037 typedef std::shared_ptr<class SourceFileWindowsMedia>   SourceFileWindowsMediaRef;
00038 typedef std::shared_ptr<class LoaderSourceFileWindowsMedia> LoaderSourceFileWindowsMediaRef;
00039 
00040 class LoaderSourceFileWindowsMedia : public Loader {
00041   public:
00042     static LoaderSourceFileWindowsMediaRef  createRef( SourceFileWindowsMedia *source, Target *target );    
00043     ~LoaderSourceFileWindowsMedia();
00044     
00045     uint32_t getOptimalBufferSize() const { return mMaxBufferSize; }
00046     void loadData( BufferList *ioData );
00047 
00048     uint64_t getSampleOffset() const;
00049     void setSampleOffset( uint64_t anOffset );
00050     
00051   protected:
00052     LoaderSourceFileWindowsMedia( SourceFileWindowsMedia * source, Target * target );
00053 
00054     uint64_t timeAtSample( uint64_t aSample ) const;
00055     uint64_t sampleAtTime( uint64_t aTime ) const;
00056 
00057     SourceFileWindowsMedia          * mSource;
00058     WAVEFORMATEX                    mOutputFormat;
00059 
00060     uint32_t                        mStreamSize;
00061     std::shared_ptr<IWMSyncReader>  mReader;
00062     std::shared_ptr<IWMHeaderInfo>  mHeaderInfo;
00063 
00064     uint32_t                        mMaxBufferSize;
00065     uint64_t                        mSampleOffset;
00066     uint32_t                        mSrcBlockAlign;
00067     uint32_t                        mSrcSampleRate;
00068     uint16_t                        mSrcChannelCount;
00069     uint32_t                        mSrcBitsPerSample;
00070 };
00071 
00072 
00073 class SourceFileWindowsMedia : public Source {
00074   public:
00075     static SourceRef                    createRef( DataSourceRef dataSourceRef ) { return createFileRef( dataSourceRef ); }
00076     static SourceFileWindowsMediaRef    createFileRef( DataSourceRef dataSourceRef );
00077     ~SourceFileWindowsMedia();
00078 
00079     virtual LoaderRef createLoader( Target *target ) { return LoaderSourceFileWindowsMedia::createRef( this, target ); }
00080   
00081     uint32_t getLength() const { return mBuffer.getDataSize(); };
00082     double getDuration() const { /*TODO*/ return 0.0;  }
00083 
00084     static void     registerSelf();
00085   protected:
00086     SourceFileWindowsMedia( DataSourceRef dataSourceRef );
00087 
00088     cinder::Buffer mBuffer;
00089     std::shared_ptr<void> mMemHandle;
00090 
00091     friend LoaderSourceFileWindowsMedia;
00092 };
00093 
00094 REGISTER_AUDIOIO( SourceFileWindowsMedia )
00095 
00096 class SourceFileWindowsMediaExceptionUnsupportedData : public IoException {
00097 };
00098 
00099 }} //namespace