mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-25 07:01:09 +00:00
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@95 65c4cc65-6c06-0410-ace0-fbb531ad65f3
167 lines
4.9 KiB
C++
Executable File
167 lines
4.9 KiB
C++
Executable File
/*____________________________________________________________________________
|
|
|
|
FreeAmp - The Free MP3 Player
|
|
Portions Copyright (C) 1998-1999 EMusic.com
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program 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 General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
$Id$
|
|
|
|
____________________________________________________________________________*/
|
|
|
|
#ifndef INCLUDED_XINGLMC_H_
|
|
#define INCLUDED_XINGLMC_H_
|
|
|
|
/* system headers */
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
|
|
/* project headers */
|
|
#include "config.h"
|
|
|
|
#include "pmi.h"
|
|
#include "pmo.h"
|
|
#include "mutex.h"
|
|
#include "event.h"
|
|
#include "lmc.h"
|
|
#include "thread.h"
|
|
#include "mutex.h"
|
|
#include "queue.h"
|
|
#include "semaphore.h"
|
|
|
|
extern "C"
|
|
{
|
|
#include "mhead.h"
|
|
#include "port.h"
|
|
}
|
|
|
|
#define BS_BUFBYTES 60000U
|
|
#define PCM_BUFBYTES 60000U
|
|
|
|
typedef struct
|
|
{
|
|
int (*decode_init) (MPEG_HEAD * h, int framebytes_arg,
|
|
int reduction_code, int transform_code,
|
|
int convert_code, int freq_limit);
|
|
void (*decode_info) (DEC_INFO * info);
|
|
IN_OUT(*decode) (unsigned char *bs, short *pcm);
|
|
}
|
|
AUDIO;
|
|
|
|
#define FRAMES_FLAG 0x0001
|
|
#define BYTES_FLAG 0x0002
|
|
#define TOC_FLAG 0x0004
|
|
#define VBR_SCALE_FLAG 0x0008
|
|
|
|
#define FRAMES_AND_BYTES (FRAMES_FLAG | BYTES_FLAG)
|
|
|
|
// structure to receive extracted header
|
|
// toc may be NULL
|
|
typedef struct
|
|
{
|
|
int h_id; // from MPEG header, 0=MPEG2, 1=MPEG1
|
|
int samprate; // determined from MPEG header
|
|
int flags; // from Xing header data
|
|
int frames; // total bit stream frames from Xing header data
|
|
int bytes; // total bit stream bytes from Xing header data
|
|
int vbr_scale; // encoded vbr scale from Xing header data
|
|
unsigned char *toc; // pointer to unsigned char toc_buffer[100]
|
|
// may be NULL if toc not desired
|
|
} XHEADDATA;
|
|
|
|
enum
|
|
{
|
|
lmcError_MinimumError = 1000,
|
|
lmcError_DecodeFailed,
|
|
lmcError_AudioDecodeInitFailed,
|
|
lmcError_DecoderThreadFailed,
|
|
lmcError_PMIError,
|
|
lmcError_PMOError,
|
|
lmcError_MaximumError
|
|
};
|
|
|
|
class XingLMC:public LogicalMediaConverter
|
|
{
|
|
|
|
public:
|
|
XingLMC(FAContext *context);
|
|
virtual ~XingLMC();
|
|
|
|
virtual uint32 CalculateSongLength(const char *url);
|
|
|
|
virtual Error ChangePosition(int32 position);
|
|
|
|
virtual Error CanDecode();
|
|
virtual void Clear();
|
|
virtual Error ExtractMediaInfo();
|
|
|
|
virtual void SetPMI(PhysicalMediaInput *pmi) { m_pPmi = pmi; };
|
|
virtual void SetPMO(PhysicalMediaOutput *pmo) { m_pPmo = pmo; };
|
|
virtual Error Prepare(PullBuffer *pInputBuffer, PullBuffer *&pOutBuffer);
|
|
virtual Error InitDecoder();
|
|
|
|
virtual Error SetEQData(float *);
|
|
virtual Error SetEQData(bool);
|
|
|
|
virtual vector<char *> *GetExtensions(void);
|
|
|
|
private:
|
|
|
|
static void DecodeWorkerThreadFunc(void *);
|
|
void DecodeWork();
|
|
Error BeginRead(void *&pBuffer, unsigned int iBytesNeeded,
|
|
bool bBufferUp = true);
|
|
Error BlockingBeginRead(void *&pBuffer,
|
|
unsigned int iBytesNeeded);
|
|
Error EndRead(size_t iBytesUsed);
|
|
Error AdvanceBufferToNextFrame();
|
|
Error GetHeadInfo();
|
|
Error GetBitstreamStats(float &fTotalSeconds, float &fMsPerFrame,
|
|
int &iTotalFrames, int &iSampleRate,
|
|
int &iLayer);
|
|
|
|
int GetXingHeader(XHEADDATA *X, unsigned char *buf);
|
|
int SeekPoint(unsigned char TOC[100], int file_bytes, float percent);
|
|
int ExtractI4(unsigned char *buf);
|
|
|
|
PhysicalMediaInput *m_pPmi;
|
|
PhysicalMediaOutput *m_pPmo;
|
|
|
|
int m_iMaxWriteSize;
|
|
int32 m_frameBytes, m_iBufferUpInterval, m_iBufferSize;
|
|
size_t m_lFileSize;
|
|
MPEG_HEAD m_sMpegHead;
|
|
int32 m_iBitRate;
|
|
bool m_bBufferingUp;
|
|
Thread *m_decoderThread;
|
|
|
|
int32 m_frameCounter;
|
|
time_t m_iBufferUpdate;
|
|
char *m_szUrl;
|
|
const char *m_szError;
|
|
AUDIO m_audioMethods;
|
|
XHEADDATA *m_pXingHeader;
|
|
|
|
// These vars are used for a nasty hack.
|
|
FILE *m_fpFile;
|
|
char *m_pLocalReadBuffer;
|
|
};
|
|
|
|
#endif /* _XINGLMC_H */
|
|
|
|
|
|
|
|
|