144 lines
3.3 KiB
C
144 lines
3.3 KiB
C
|
/* DecMPA - simple MPEG Audio decoding library.
|
||
|
Copyright (C) 2002 Hauke Duden
|
||
|
|
||
|
This library is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU Lesser General Public
|
||
|
License as published by the Free Software Foundation; either
|
||
|
version 2.1 of the License, or (at your option) any later version.
|
||
|
|
||
|
This library 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
|
||
|
Lesser General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU Lesser General Public
|
||
|
License along with this library; if not, write to the Free Software
|
||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
|
||
|
For more information look at the file License.txt in this package.
|
||
|
|
||
|
email: hazard_hd@users.sourceforge.net
|
||
|
*/
|
||
|
|
||
|
//This file is a heavily modified version of SPlayPlugin.h from the original
|
||
|
//mpeglib. See Readme.txt for details.
|
||
|
|
||
|
|
||
|
#ifndef _MPADECODER_H_
|
||
|
#define _MPADECODER_H_
|
||
|
|
||
|
#include "../include/decmpa.h"
|
||
|
|
||
|
#include "DecMPAFileAccess.h"
|
||
|
|
||
|
#include "frame/pcmFrame.h"
|
||
|
#include "frame/floatFrame.h"
|
||
|
|
||
|
#include "MPAFrameFinder.h"
|
||
|
#include "MPAInfo.h"
|
||
|
|
||
|
class CMPADecoder
|
||
|
{
|
||
|
public:
|
||
|
CMPADecoder(const DecMPA_Callbacks& Callbacks,void* pCallbackContext);
|
||
|
~CMPADecoder();
|
||
|
|
||
|
int Decode(void* pBuffer,long nBufferBytes,long& nBytesDecoded);
|
||
|
int DecodeNoData(long& nDecodedBytes);
|
||
|
|
||
|
int SeekToTime(long Millis);
|
||
|
|
||
|
int GetTime(long& Time);
|
||
|
int GetDuration(long& Duration);
|
||
|
|
||
|
bool OutputFormatChanged();
|
||
|
void GetOutputFormat(DecMPA_OutputFormat& Format);
|
||
|
|
||
|
void GetMPEGHeader(DecMPA_MPEGHeader& Header);
|
||
|
|
||
|
int GetID3v2Data(unsigned char*& pData,long& nDataSize);
|
||
|
|
||
|
inline void SetDestroyNotify(void (*pNotify)(void*),void* pContext);
|
||
|
|
||
|
long GetFilePositionFromTime(long Millis);
|
||
|
|
||
|
int SetParam(int ID,long Value);
|
||
|
long GetParam(int ID);
|
||
|
|
||
|
protected:
|
||
|
int DecodeNextFrame(bool bNoData);
|
||
|
bool ReadNextFrame();
|
||
|
|
||
|
void HandleDecodedData(AudioFrame* playFrame);
|
||
|
void SetOutputFormat(AudioFrame* pNewFormatFrame);
|
||
|
|
||
|
bool ReadDecodedData(void* pDest,long nBytes,long& nRead);
|
||
|
|
||
|
void Flush();
|
||
|
|
||
|
int EnsurePrepared();
|
||
|
void HandleID3Tag();
|
||
|
|
||
|
void UpdateMPEGHeader(MpegAudioHeader* pHeader);
|
||
|
|
||
|
DecMPA_Callbacks m_Callbacks;
|
||
|
void* m_pCallbackContext;
|
||
|
|
||
|
bool m_bDoFloat;
|
||
|
|
||
|
AudioFrame* m_pAudioFrame;
|
||
|
FloatFrame* m_pFloatFrame;
|
||
|
PCMFrame* m_pPCMFrame;
|
||
|
|
||
|
AudioFrame* m_pFormatFrame;
|
||
|
int m_nOutputBlockSize;
|
||
|
|
||
|
CDecMPAFileAccess* m_pFileAccess;
|
||
|
|
||
|
long m_nBufferBytes;
|
||
|
long m_nUsedBufferBytes;
|
||
|
unsigned char* m_pBuffer;
|
||
|
|
||
|
double m_nReadTime;
|
||
|
double m_nBufferStartTime;
|
||
|
double m_nDecodeTime;
|
||
|
|
||
|
DecMPA_OutputFormat m_OutputFormat;
|
||
|
bool m_bOutputFormatChanged;
|
||
|
|
||
|
DecMPA_MPEGHeader m_MPEGHeader;
|
||
|
|
||
|
bool m_bFirstDecode;
|
||
|
bool m_bPrepared;
|
||
|
bool m_bHasFrame;
|
||
|
|
||
|
int m_nResyncCounter;
|
||
|
|
||
|
void* m_pDecodeEngine;
|
||
|
|
||
|
CMPAFrameFinder m_FrameFinder;
|
||
|
CMPAInfo m_Info;
|
||
|
|
||
|
bool m_bStoreID3v2;
|
||
|
unsigned char* m_pID3v2Data;
|
||
|
long m_nID3v2DataSize;
|
||
|
|
||
|
void (*m_pDestroyNotify)(void*);
|
||
|
void* m_pDestroyNotifyContext;
|
||
|
|
||
|
long m_aParams[DECMPA_PARAMCOUNT];
|
||
|
|
||
|
bool m_bNotMPEG;
|
||
|
|
||
|
bool m_bDecoderNeedsFlush;
|
||
|
};
|
||
|
|
||
|
inline void CMPADecoder::SetDestroyNotify(void (*pNotify)(void*),void* pContext)
|
||
|
{
|
||
|
m_pDestroyNotify=pNotify;
|
||
|
m_pDestroyNotifyContext=pContext;
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|