"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSSoundLib/Src/Ogg/LSSVorbisFile.h

00001 /********************************************************************
00002  *                                                                  *
00003  * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
00004  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
00005  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
00006  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
00007  *                                                                  *
00008  * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007             *
00009  * by the Xiph.Org Foundation http://www.xiph.org/                  *
00010  *                                                                  *
00011  ********************************************************************
00012 
00013  function: stdio-based convenience library for opening/seeking/decoding
00014  last mod: $Id: vorbisfile.h 17182 2010-04-29 03:48:32Z xiphmont $
00015 
00016  ********************************************************************/
00017 
00018 
00019 #ifndef __LSE_VORBISFILE_H__
00020 #define __LSE_VORBISFILE_H__
00021 
00022 #include "../LSSSoundLib.h"
00023 #include "Allocator/LSTLAllocator.h"
00024 #include "LSSOgg.h"
00025 #include "LSSVorbisCodec.h"
00026 
00027 namespace lss {
00028 
00035         class CVorbisFile {
00036         public :
00037                 // == Types.
00042                 typedef struct LSS_OV_CALLBACKS {
00046                         LSUINTPTR                                                       (* PfReadFunc)( LSVOID * _pvPtr, LSUINTPTR _uiptrSize, LSUINTPTR _uiptrNMemb, LSVOID * _pvDataSource );
00047 
00051                         LSINT32                                                         (* PfSeekFunc)( LSVOID * _pvDataSource, LSINT64 _i64Offset, LSINT32 _i32Whence );
00052 
00056                         LSINT32                                                         (* PfCloseFunc)( LSVOID * _pvDataSource );
00057 
00061                         LSINT64                                                         (* PfTellFunc)( LSVOID * _pvDataSource );
00062                 } * LPLSS_OV_CALLBACKS, * const LPCLSS_OV_CALLBACKS;
00063 
00067                 typedef struct LSS_OV_FILE {
00068                         LSVOID *                                                        datasource; // Pointer to a FILE *, etc.
00069                         LSINT32                                                         seekable;
00070                         LSINT64                                                         offset;
00071                         LSINT64                                                         end;
00072                         COgg::ogg_sync_state                            oy;
00073 
00074                         // If the FILE handle isn't seekable (eg. a pipe), only the current stream appears.
00075                         LSINT32                                                         links;
00076                         LSINT64 *                                                       offsets;
00077                         LSINT64 *                                                       dataoffsets;
00078                         LSINT32 *                                                       serialnos;
00079                         LSINT64 *                                                       pcmlengths; // Overloaded to maintain binary
00080                                                                                                                         //      compatibility; x2 size, stores both
00081                                                                                                                         //      beginning and end values.
00082                         CVorbisCodec::vorbis_info *                     vi;
00083                         CVorbisCodec::vorbis_comment *          vc;
00084 
00085                         // Decoding working state local storage.
00086                         LSINT64                                                         pcm_offset;
00087                         LSINT32                                                         ready_state;
00088                         LSINT32                                                         current_serialno;
00089                         LSINT32                                                         current_link;
00090 
00091                         LSDOUBLE                                                        bittrack;
00092                         LSDOUBLE                                                        samptrack;
00093 
00094                         COgg::ogg_stream_state                          os;                     // Take physical pages, weld into a logical stream of packets.
00095                         CVorbisCodec::vorbis_dsp_state          vd;                     // Central working state for the packet->PCM decoder.
00096                         CVorbisCodec::vorbis_block                      vb;                     // Local working space for packet->PCM decode.
00097 
00098                         LSS_OV_CALLBACKS                                        callbacks;
00099 
00100                 } * LPLSS_OV_FILE, * const LPCLSS_OV_FILE;
00101 
00102 
00103                 // == Functions.
00117                 static LSBOOL LSE_CALL                                  LoadOggFile( const LSCHAR * _pcFile,
00118                         LSUINT8 * &_pui8Data, LSUINT32 &_ui32Length,
00119                         LSUINT32 &_ui32Freq, LSUINT32 &_ui32Bits, LSUINT32 &_ui32Channels, CAllocator * _paAllocator );
00120 
00127                 static LSUINT64 LSE_CALL                                GetPcmCount( LSS_OV_FILE &_ovfFile );
00128 
00136                 static LSINT32                                                  OvClear( LSS_OV_FILE * _povfFile );
00137 
00153                 static LSINT32                                                  OvFOpen( const LSCHAR * _pcPath, LSS_OV_FILE * _povfFile );
00154 
00174                 //static LSINT32                                                        OvOpen( FILE * _pfFile, LSS_OV_FILE * _povfFile, const LSCHAR * _pcInitial, LSINT32 _i32BytesI );
00175 
00193                 static LSINT32                                                  OvOpenCallbacks( LSVOID * _pvDataSource, LSS_OV_FILE * _povfFile, 
00194                         const LSCHAR * _pcInitial, LSINT32 _i32BytesI, LSS_OV_CALLBACKS _ocCallbacks );
00195 
00211                 //static LSINT32                                                        OvTest( FILE * _pfFile, LSS_OV_FILE * _povfFile, const LSCHAR * _pcInitial, LSINT32 _i32BytesI );
00212 
00229                 static LSINT32                                                  OvTestCallbacks( LSVOID * _pvDataSource, LSS_OV_FILE * _povfFile, 
00230                         const LSCHAR * _pcInitial, LSINT32 _i32BytesI, LSS_OV_CALLBACKS _ocCallbacks );
00231 
00243                 static LSINT32                                                  OvTestOpen( LSS_OV_FILE * _povfFile );
00244 
00255                 static LSINT32                                                  OvBitrate( LSS_OV_FILE * _povfFile, LSINT32 _i32I );
00256 
00266                 static LSINT32                                                  OvBitrateInstant( LSS_OV_FILE * _povfFile );
00267 
00275                 static LSINT32                                                  OvStreams( LSS_OV_FILE * _povfFile );
00276 
00284                 static LSINT32                                                  OvSeekable( LSS_OV_FILE * _povfFile );
00285 
00294                 static LSINT32                                                  OvSerialNumber( LSS_OV_FILE * _povfFile, LSINT32 _i32I );
00295 
00305                 static LSINT64                                                  OvRawTotal( LSS_OV_FILE * _povfFile, LSINT32 _i32I );
00306 
00316                 static LSINT64                                                  OvPcmTotal( LSS_OV_FILE * _povfFile, LSINT32 _i32I );
00317 
00327                 static LSDOUBLE                                                 OvTimeTotal( LSS_OV_FILE * _povfFile, LSINT32 _i32I );
00328 
00343                 static LSINT32                                                  OvRawSeek( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos );
00344 
00358                 static LSINT32                                                  OvPcmSeek( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos );
00359 
00374                 static LSINT32                                                  OcPvmSeekPage( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos );
00375 
00388                 static LSINT32                                                  OvTimeSeek( LSS_OV_FILE * _povfFile, LSDOUBLE _dPos );
00389 
00404                 static LSINT32                                                  OvTimeSeekPage( LSS_OV_FILE * _povfFile, LSDOUBLE _dPos );
00405 
00422                 static LSINT32                                                  OvRawSeekLap( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos );
00423 
00439                 static LSINT32                                                  OvPcmSeekLap( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos );
00440 
00457                 static LSINT32                                                  OvPcmSeekPageLap( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos );
00458 
00474                 static LSINT32                                                  OvTimeSeekLap( LSS_OV_FILE * _povfFile, LSDOUBLE _dPos );
00475 
00492                 static LSINT32                                                  OvTimeSeekPageLap( LSS_OV_FILE * _povfFile, LSDOUBLE _dPos );
00493 
00502                 static LSINT64                                                  OvRawTell( LSS_OV_FILE * _povfFile );
00503 
00511                 static LSINT64                                                  OvPcmTell( LSS_OV_FILE * _povfFile );
00512 
00520                 static LSDOUBLE                                                 OvTimeTell( LSS_OV_FILE * _povfFile );
00521 
00530                 static CVorbisCodec::vorbis_info *              OvInfo( LSS_OV_FILE * _povfFile, LSINT32 _i32I );
00531 
00540                 static CVorbisCodec::vorbis_comment *   OvComment( LSS_OV_FILE * _povfFile, LSINT32 _i32I );
00541 
00556                 static LSINT32                                                  OvReadFloat( LSS_OV_FILE * _povfFile, LSFLOAT *** _pppfPcmChannels, LSINT32 _i32Samples,
00557                         LSINT32 * _pi32BitStream );
00558 
00577                 static LSINT32                                                  OvReadFilter( LSS_OV_FILE * _povfFile, LSCHAR * _pcBuffer, LSINT32 _i32Length,
00578                         LSINT32 _i32BigEndianP, LSINT32 _i32Word, LSINT32 _i32Signed, LSINT32 * _pi32BitStream,
00579                         LSVOID (* _pfFilter)( LSFLOAT ** _ppPcm, LSINT32 _i32Channels, LSINT32 _i32Samples, LSVOID * _pvFilterParam ), LSVOID * _pvFilterParam );
00580 
00609                 static LSINT32                                                  OvRead( LSS_OV_FILE * _povfFile, LSCHAR * _pcBuffer, LSINT32 _i32Length,
00610                         LSINT32 _i32BigEndianP, LSINT32 _i32Word, LSINT32 _i32Signed, LSINT32 * _pi32BitStream );
00611 
00625                 static LSINT32                                                  OvCrosslap( LSS_OV_FILE * _povfFile1, LSS_OV_FILE * _povfFile2 );
00626 
00634                 static LSINT32                                                  OvHalfRate( LSS_OV_FILE * _povfFile, LSINT32 _i32Flag );
00635 
00642                 static LSINT32                                                  OvHalfRateP( LSS_OV_FILE * _povfFile );
00643 
00644 
00645         protected :
00646                 // == Functions.
00655                 //static LSINT32                                                        OvHeaderFSeekWrap( FILE * _pfFile, LSINT64 _i64Off, LSINT32 _i32Whence );
00656 
00667                 static LSINT32                                                  OvOpen1( LSVOID * _pvFile, LSS_OV_FILE * _povfFile, const LSCHAR * _pcInitial, 
00668                         LSINT32 _i32BytesI, LSS_OV_CALLBACKS _ocCallbacks );
00669 
00676                 static LSINT32                                                  OvOpen2( LSS_OV_FILE *_povfFile );
00677 
00689                 static LSINT32                                                  OvFetchHeaders( LSS_OV_FILE * _povfFile, CVorbisCodec::vorbis_info * _pviVi, CVorbisCodec::vorbis_comment * _pvcVc, 
00690                         LSINT32 ** _ppi32SerialNoList, LSINT32 * _pi32SerialNoN, 
00691                         COgg::ogg_page * _popOgPtr );
00692 
00699                 static LSINT32                                                  OvOpenSeekable2( LSS_OV_FILE *_povfFile );
00700 
00709                 static LSINT64                                                  OvGetNextPage( LSS_OV_FILE *_povfFile, COgg::ogg_page * _popOg, 
00710                         LSINT64 _i64Boundary );
00711 
00720                 static LSINT32                                                  OvLookUpPageSerialNo( COgg::ogg_page * _popOg, LSINT32 * _pi32SerialNoList, LSINT32 _i32N );
00721 
00729                 static LSVOID                                                   OvAddSerialNo( COgg::ogg_page * _popOg, LSINT32 ** _ppi32SerialNoList, LSINT32 * _pi32N );
00730 
00738                 static LSINT64                                                  OvInitialPcmOffset( LSS_OV_FILE * _povfFile, CVorbisCodec::vorbis_info * _pviInfo );
00739 
00750                 static LSINT64                                                  OvGetPrevPageSerial( LSS_OV_FILE * _povfFile, 
00751                         LSINT32 * _pi32SerialList, LSINT32 _i32SerialCount, 
00752                         LSINT32 * _pi32SerialNo, LSINT64 * _pi64GranPos );
00753 
00768                 static LSINT32                                                  OvBisectForwardSerialNo( LSS_OV_FILE * _povfFile, 
00769                         LSINT64 _i64Begin, 
00770                         LSINT64 _i64Searched, 
00771                         LSINT64 _i64End, 
00772                         LSINT64 _i64EndGran, 
00773                         LSINT32 _i32EndSerial, 
00774                         LSINT32 * _pi32CurrentNoList, 
00775                         LSINT32 _i32CurrentNoS, 
00776                         LSINT32 _i32M );
00777 
00784                 static LSINT32                                                  OvGetData( LSS_OV_FILE * _povfFile );
00785 
00794                 static LSINT32                                                  OvLookUpSerialNo( LSINT32 _i32S, LSINT32 * _pi32SerialNoList, LSINT32 _i32N );
00795 
00803                 static LSINT32                                                  OvSeekHelper( LSS_OV_FILE *_povfFile, LSINT64 _i64Offset );
00804 
00810                 static LSVOID                                                   OvDecodeClear( LSS_OV_FILE * _povfFile );
00811 
00818                 static LSINT32                                                  OvMakeDecodeReady( LSS_OV_FILE * _povfFile );
00819 
00829                 static LSINT32                                                  OvFetchAndProcessPacket( LSS_OV_FILE *_povfFile, COgg::ogg_packet * _popOpIn, LSINT32 _i32ReadP, LSINT32 _i32SpanP );
00830 
00838                 static LSINT64                                                  OvGetPrevPage( LSS_OV_FILE * _povfFile, COgg::ogg_page * _popPage );
00839 
00848                 static LSINT32                                                  Ov64SeekLap( LSS_OV_FILE * _povfFile, LSINT64 _i64Pos, LSINT32 (* _pfLocalSeek)( LSS_OV_FILE *, LSINT64 ) );
00849 
00856                 static LSINT32                                                  OvInitSet( LSS_OV_FILE * _povfFile );
00857 
00867                 static LSVOID                                                   OvGetLap( LSS_OV_FILE *_povfFile, CVorbisCodec::vorbis_info * _pviInfo, CVorbisCodec::vorbis_dsp_state * _pvdsVd, LSFLOAT ** _ppfLapPcm, LSINT32 _i32LapSize );
00868 
00875                 static LSINT32                                                  OvInitPrime( LSS_OV_FILE * _povfFile );
00876 
00889                 static LSVOID                                                   OvSplice( LSFLOAT ** _ppfPcm, LSFLOAT ** _ppfLapPcm, 
00890                         LSINT32 _i32N1, LSINT32 _i32N2, 
00891                         LSINT32 _i32Ch1, LSINT32 _i32Ch2, 
00892                         LSFLOAT * _pfW1, LSFLOAT * _pfW2 );
00893 
00902                 static LSINT32                                                  OvDSeekLap( LSS_OV_FILE *_povfFile, LSDOUBLE _dPos, LSINT32 (* _pfLocalSeek)( LSS_OV_FILE *, LSDOUBLE ) );
00903 
00909                 static LSINT32                                                  OvHostIsBigEndian();
00910 
00920                 static LSUINTPTR                                                ReadFunc( LSVOID * _pvPtr, LSUINTPTR _uiptrSize, LSUINTPTR _uiptrNMemb, LSVOID * _pvDataSource );
00921 
00930                 static LSINT32                                                  SeekFunc( LSVOID * _pvDataSource, LSINT64 _i64Offset, LSINT32 _i32Whence );
00931 
00938                 static LSINT32                                                  CloseFunc( LSVOID * _pvDataSource );
00939 
00946                 static LSINT64                                                  TellFunc( LSVOID * _pvDataSource );
00947         };
00948 
00949 }       // namespace lss
00950 
00951 #endif  // __LSE_VORBISFILE_H__
00952 
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator