转载自:http://www.oschina.net/code/snippet_196503_6933
头文件:
///////////////////////////////////////////////////////////////////////
////audio_decode.h 2010-11-15 by lishen
#ifndef _AUDIODECODE_H_
#define _AUDIODECODE_H_
#include "../lib/neaacdec.h"
![]()
typedef struct _ADecode
{
NeAACDecHandle m_hAac; // audio decode handle
int m_init;
}ADecode;
typedef int (*audio_decode_event)(DWORD arg1, const char *buf, int len);
![]()
ADecode* ADecode_Open ();
int ADecode_Close (ADecode* adecode);
int ADecode_Decode (ADecode* adecode,
const char *buf,
int buf_len,
audio_decode_event fnt,
DWORD arg);
![]()
![]()
#endif
实现文件:
///////////////////////////////////////////////////////////////////////
////audio_decode.cpp 2010-11-15 by lishen
#include "../common/common.h"
#include <windows.h>
#include <stdio.h>
#include "audio_decode.h"
#pragma comment(lib, "libfaad2.lib")
![]()
ADecode* ADecode_Open ()
{
NeAACDecHandle hAac = NeAACDecOpen();
NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration(hAac);
NeAACDecSetConfiguration(hAac, conf);
![]()
ADecode* adecode = new ADecode ();
adecode->m_hAac = hAac;
adecode->m_init = 0;
![]()
return adecode;
}
![]()
int ADecode_Close (ADecode* adecode)
{
if (adecode->m_hAac != NULL)
{
NeAACDecClose(adecode->m_hAac);
}
delete adecode;
![]()
return 0;
}
![]()
int ADecode_Decode (ADecode* adecode, const char *buf, int buf_len,
audio_decode_event fnt, DWORD arg)
{
int ret = 0;
NeAACDecFrameInfo hInfo;
![]()
if (adecode->m_init == 0)
{
adecode->m_init = 1;
unsigned long samplerate;
unsigned char channels;
NeAACDecInit (adecode->m_hAac, (unsigned char *) buf, buf_len, &samplerate, &channels);
}
![]()
short buf1[1024 * 4] = {0};
int buf_off = 0;
unsigned char *p = (unsigned char *) buf;
do
{
void* out = NeAACDecDecode (adecode->m_hAac, &hInfo, p, buf_len);
if ((hInfo.error == 0) && (hInfo.samples > 0))
{
p += hInfo.bytesconsumed;
buf_len -= hInfo.bytesconsumed;
![]()
// distill wave
short *p1 = buf1, *p2 = (short*) out;
for (int k = (hInfo.samples / hInfo.channels); k; k --){*p1 ++ = *p2; p2 += 2;}
//trace0 (PROG_DEBUG, "%s-%d ADecode_decode %d.", __FILE__, __LINE__, len);
// put out wave
if (fnt != 0){ret = fnt (arg, (char*) buf1, hInfo.samples);}
}
else if (hInfo.error != 0)
{
ret = -1;
break;
}
}while (buf_len > 0);
![]()
return ret;
}
![]()
![]()
头文件:























实现文件:












































































