mirror of https://github.com/axmolengine/axmol.git
resert some files
This commit is contained in:
parent
f1614fb4de
commit
eaad344762
|
@ -0,0 +1,247 @@
|
|||
/*
|
||||
* MyAudioOutListener.cpp
|
||||
*
|
||||
* Created on: 2011-1-21
|
||||
* Author: Administrator
|
||||
*/
|
||||
|
||||
#include "MyAudioOutListener.h"
|
||||
#include <stdio.h>
|
||||
#include "WavHead.h"
|
||||
|
||||
|
||||
using namespace Osp::Base;
|
||||
using namespace Osp::Base::Collection;
|
||||
using namespace Osp::Media;
|
||||
|
||||
#define MAX_BUFFER_SIZE 2520 // 840 byte
|
||||
|
||||
MyAudioOutEventListener::MyAudioOutEventListener()
|
||||
{
|
||||
__totalWriteBufferNum = 0;
|
||||
__playCount = 0;
|
||||
__pDataArray = null;
|
||||
__pAudioOut = null;
|
||||
__pPcmBuffer = null;
|
||||
__pcmLen = 0;
|
||||
}
|
||||
|
||||
MyAudioOutEventListener::~MyAudioOutEventListener()
|
||||
{
|
||||
AppLog("dealoc MyAudioOutEventListener");
|
||||
|
||||
if (__pDataArray != null)
|
||||
{
|
||||
__pDataArray->RemoveAll(true);
|
||||
delete __pDataArray;
|
||||
__pDataArray = null;
|
||||
}
|
||||
if (__pAudioOut != null)
|
||||
{
|
||||
__pAudioOut->Stop();
|
||||
__pAudioOut->Unprepare();
|
||||
delete __pAudioOut;
|
||||
__pAudioOut = null;
|
||||
}
|
||||
if (__pPcmBuffer != null)
|
||||
{
|
||||
delete[] __pPcmBuffer;
|
||||
__pPcmBuffer = null;
|
||||
}
|
||||
}
|
||||
|
||||
result MyAudioOutEventListener::Construct(const char* pszFilePath)
|
||||
{
|
||||
__pAudioOut = new AudioOut();
|
||||
__pAudioOut->Construct(*this);
|
||||
WAVE wavHead;
|
||||
FILE* fp = fopen(pszFilePath, "rb");
|
||||
if (fp != NULL)
|
||||
{
|
||||
if (GetWaveHeadInfo(fp, wavHead))
|
||||
{
|
||||
__pPcmBuffer = new char[wavHead.SubChunk2Size];
|
||||
__pcmLen = wavHead.SubChunk2Size;
|
||||
fread(__pPcmBuffer, __pcmLen, 1, fp);
|
||||
fclose(fp);
|
||||
}
|
||||
else
|
||||
{
|
||||
fclose(fp);
|
||||
return E_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
__pDataArray = new ArrayList();
|
||||
|
||||
// AudioOut Preparation
|
||||
AudioSampleType audioSampleType;
|
||||
AudioChannelType audioChannelType;
|
||||
int audioSampleRate = 0;
|
||||
|
||||
if (wavHead.BitsPerSample == 8)
|
||||
{
|
||||
audioSampleType = AUDIO_TYPE_PCM_U8;
|
||||
|
||||
}
|
||||
else if (wavHead.BitsPerSample == 16)
|
||||
{
|
||||
audioSampleType = AUDIO_TYPE_PCM_S16_LE;
|
||||
}
|
||||
else
|
||||
{
|
||||
audioSampleType = AUDIO_TYPE_NONE;
|
||||
}
|
||||
|
||||
if (wavHead.NumChannels == 1)
|
||||
{
|
||||
audioChannelType = AUDIO_CHANNEL_TYPE_MONO;
|
||||
}
|
||||
else if (wavHead.NumChannels == 2)
|
||||
{
|
||||
audioChannelType = AUDIO_CHANNEL_TYPE_STEREO;
|
||||
}
|
||||
else
|
||||
{
|
||||
audioChannelType = AUDIO_CHANNEL_TYPE_NONE;
|
||||
}
|
||||
|
||||
audioSampleRate = wavHead.SampleRate;
|
||||
|
||||
result r = __pAudioOut->Prepare(audioSampleType, audioChannelType, audioSampleRate);
|
||||
AppLog("The audio out prepare result is %s", GetErrorMessage(r));
|
||||
AppLogDebug("The audio out prepare result in ApplogDebug message");
|
||||
|
||||
ByteBuffer* pTotalData = null;
|
||||
pTotalData = new ByteBuffer();
|
||||
pTotalData->Construct(__pcmLen);
|
||||
pTotalData->SetArray((byte*)__pPcmBuffer, 0, __pcmLen);
|
||||
pTotalData->Flip();
|
||||
|
||||
int totalSize = pTotalData->GetLimit();
|
||||
int currentPosition = 0;
|
||||
ByteBuffer* pItem = null;
|
||||
byte givenByte;
|
||||
|
||||
// Binding data buffers into the array
|
||||
if(totalSize > MAX_BUFFER_SIZE)
|
||||
{
|
||||
do
|
||||
{
|
||||
pItem = new ByteBuffer();
|
||||
pItem->Construct(MAX_BUFFER_SIZE);
|
||||
|
||||
for(int i = 0; i < MAX_BUFFER_SIZE; i++)
|
||||
{
|
||||
// Read it per 1 byte
|
||||
pTotalData->GetByte(currentPosition++,givenByte);
|
||||
pItem->SetByte(givenByte);
|
||||
if(currentPosition == totalSize )
|
||||
break;
|
||||
}
|
||||
__pDataArray->Add(*pItem);
|
||||
|
||||
}while(currentPosition < totalSize);
|
||||
__totalWriteBufferNum = __pDataArray->GetCount();
|
||||
}
|
||||
else
|
||||
{
|
||||
pItem = new ByteBuffer();
|
||||
pItem->Construct(totalSize);
|
||||
for(int i = 0; i < totalSize; i++)
|
||||
{
|
||||
// Read it per 1 byte
|
||||
pTotalData->GetByte(i, givenByte);
|
||||
pItem->SetByte(givenByte);
|
||||
}
|
||||
__pDataArray->Add(*pItem);
|
||||
__totalWriteBufferNum = __pDataArray->GetCount();
|
||||
// non-case for now, may the size of test file is bigger than MAX size
|
||||
}
|
||||
delete pTotalData;
|
||||
pTotalData = null;
|
||||
|
||||
// Start playing until the end of the array
|
||||
// __pAudioOut->Start();
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
void MyAudioOutEventListener::play()
|
||||
{
|
||||
if (__pAudioOut->GetState() == AUDIOOUT_STATE_PLAYING)
|
||||
{
|
||||
__pAudioOut->Reset();
|
||||
}
|
||||
|
||||
ByteBuffer* pWriteBuffer = null;
|
||||
for (int i = 0; i < __totalWriteBufferNum; i++)
|
||||
{
|
||||
pWriteBuffer = static_cast<ByteBuffer*>(__pDataArray->GetAt(i));
|
||||
__pAudioOut->WriteBuffer(*pWriteBuffer);
|
||||
}
|
||||
__pAudioOut->Start();
|
||||
__playCount++;
|
||||
}
|
||||
|
||||
void MyAudioOutEventListener::stop()
|
||||
{
|
||||
__pAudioOut->Stop();
|
||||
}
|
||||
|
||||
void MyAudioOutEventListener::setVolume(int volume)
|
||||
{
|
||||
__pAudioOut->SetVolume(volume);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies when the device has written a buffer completely.
|
||||
*
|
||||
* @param[in] src A pointer to the AudioOut instance that fired the event
|
||||
*/
|
||||
void MyAudioOutEventListener::OnAudioOutBufferEndReached(Osp::Media::AudioOut& src)
|
||||
{
|
||||
result r = E_SUCCESS;
|
||||
|
||||
if( __playCount == __totalWriteBufferNum)
|
||||
{
|
||||
// The End of array, it's time to finish
|
||||
//cjh r = src.Unprepare();
|
||||
|
||||
//Reset Variable
|
||||
__playCount = 0;
|
||||
//cjh __totalWriteBufferNum = 0;
|
||||
|
||||
}else
|
||||
{
|
||||
//Not yet reached the end of array
|
||||
//Write the next buffer
|
||||
__playCount++;
|
||||
// ByteBuffer* pWriteBuffer = static_cast<ByteBuffer*>(__pDataArray->GetAt(__playCount++));
|
||||
// r = src.WriteBuffer(*pWriteBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies that the output device is being interrupted by a task of higher priority than AudioOut.
|
||||
*
|
||||
* @param[in] src A pointer to the AudioOut instance that fired the event
|
||||
*/
|
||||
void MyAudioOutEventListener::OnAudioOutInterrupted(Osp::Media::AudioOut& src)
|
||||
{
|
||||
AppLog("OnAudioOutInterrupted");
|
||||
if (__pAudioOut->GetState() == AUDIOOUT_STATE_PLAYING)
|
||||
{
|
||||
__pAudioOut->Stop();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies that the interrupted output device has been released.
|
||||
*
|
||||
* @param[in] src A pointer to the AudioOut instance that fired the event
|
||||
*/
|
||||
void MyAudioOutEventListener::OnAudioOutReleased(Osp::Media::AudioOut& src)
|
||||
{
|
||||
AppLog("OnAudioOutReleased");
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* MyAudioOutListener.h
|
||||
*
|
||||
* Created on: 2011-1-21
|
||||
* Author: Administrator
|
||||
*/
|
||||
|
||||
#ifndef MYAUDIOOUTLISTENER_H_
|
||||
#define MYAUDIOOUTLISTENER_H_
|
||||
|
||||
#include <FBase.h>
|
||||
#include <FMedia.h>
|
||||
|
||||
|
||||
|
||||
class MyAudioOutEventListener :
|
||||
public Osp::Media::IAudioOutEventListener
|
||||
{
|
||||
|
||||
public:
|
||||
MyAudioOutEventListener();
|
||||
|
||||
virtual ~MyAudioOutEventListener();
|
||||
|
||||
result Construct(const char* pszFilePath);
|
||||
|
||||
void play();
|
||||
void stop();
|
||||
void setVolume(int volume);
|
||||
/**
|
||||
* Notifies when the device has written a buffer completely.
|
||||
*
|
||||
* @param[in] src A pointer to the AudioOut instance that fired the event
|
||||
*/
|
||||
virtual void OnAudioOutBufferEndReached(Osp::Media::AudioOut& src);
|
||||
/**
|
||||
* Notifies that the output device is being interrupted by a task of higher priority than AudioOut.
|
||||
*
|
||||
* @param[in] src A pointer to the AudioOut instance that fired the event
|
||||
*/
|
||||
virtual void OnAudioOutInterrupted(Osp::Media::AudioOut& src);
|
||||
|
||||
/**
|
||||
* Notifies that the interrupted output device has been released.
|
||||
*
|
||||
* @param[in] src A pointer to the AudioOut instance that fired the event
|
||||
*/
|
||||
virtual void OnAudioOutReleased(Osp::Media::AudioOut& src);
|
||||
|
||||
private:
|
||||
int __totalWriteBufferNum;
|
||||
int __playCount;
|
||||
Osp::Base::Collection::ArrayList* __pDataArray;
|
||||
Osp::Media::AudioOut* __pAudioOut;
|
||||
char* __pPcmBuffer;
|
||||
int __pcmLen;
|
||||
};
|
||||
|
||||
#endif /* MYAUDIOOUTLISTENER_H_ */
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
* WaveHead.cpp
|
||||
*
|
||||
* Created on: 2011-1-21
|
||||
* Author: Administrator
|
||||
*/
|
||||
|
||||
#include "WavHead.h"
|
||||
#include <stdio.h>
|
||||
#include <FBaseSys.h>
|
||||
|
||||
bool GetWaveHeadInfo(FILE*stream, WAVE& outWavHead)
|
||||
{
|
||||
char szTmp[100] = {0};
|
||||
int i = 0;
|
||||
|
||||
// FILE *stream;
|
||||
|
||||
// if((stream = fopen(fileName,"rb"))==NULL)
|
||||
// {
|
||||
// AppLog("ERROR:can't open the file!");
|
||||
//
|
||||
// return false;
|
||||
// }
|
||||
/*
|
||||
|
||||
* 读wav文件的各个field
|
||||
|
||||
*/
|
||||
|
||||
fread(outWavHead.ChunkID, 4, 1, stream);
|
||||
|
||||
outWavHead.ChunkID[4] = (char)0;
|
||||
|
||||
fread(&(outWavHead.ChunkSize),4, 1, stream);
|
||||
|
||||
fread(outWavHead.Format, 4, 1, stream);
|
||||
|
||||
outWavHead.Format[4] = (char)0;
|
||||
|
||||
fread(outWavHead.SubChunk1ID, 4, 1, stream);
|
||||
|
||||
outWavHead.SubChunk1ID[4] = (char)0;
|
||||
|
||||
fread(&(outWavHead.SubChunk1Size), 4, 1, stream);
|
||||
|
||||
fread(&(outWavHead.AudioFormat), 2, 1, stream);
|
||||
|
||||
fread(&(outWavHead.NumChannels), 2, 1, stream);
|
||||
|
||||
fread(&(outWavHead.SampleRate), 4, 1, stream);
|
||||
|
||||
fread(&(outWavHead.ByteRate), 4, 1, stream);
|
||||
|
||||
fread(&(outWavHead.BlockAlign), 2, 1, stream);
|
||||
|
||||
fread(&(outWavHead.BitsPerSample), 2, 1, stream);
|
||||
|
||||
fseek(stream, 0, SEEK_SET);
|
||||
|
||||
|
||||
fread(szTmp, 64, 1, stream);
|
||||
|
||||
for (i = 0; i <= 60; i++)
|
||||
{
|
||||
if (szTmp[i] == 'd' && szTmp[i+1] == 'a' && szTmp[i+2] == 't' && szTmp[i+3] == 'a')
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fseek(stream, i, SEEK_SET);
|
||||
|
||||
fread(outWavHead.SubChunk2ID, 4, 1, stream);
|
||||
|
||||
outWavHead.SubChunk2ID[4] = (char)0;
|
||||
|
||||
fread(&(outWavHead.SubChunk2Size), 4, 1, stream);
|
||||
|
||||
return true;
|
||||
}
|
|
@ -0,0 +1,92 @@
|
|||
/*
|
||||
* WavHead.h
|
||||
*
|
||||
* Created on: 2011-1-21
|
||||
* Author: Administrator
|
||||
*/
|
||||
|
||||
#ifndef WAVHEAD_H_
|
||||
#define WAVHEAD_H_
|
||||
|
||||
#include <stdio.h>
|
||||
/* WAVE文件头 */
|
||||
|
||||
typedef struct wave_tag
|
||||
|
||||
{
|
||||
|
||||
char ChunkID[5]; // "RIFF"标志
|
||||
|
||||
unsigned long int ChunkSize; // 文件长度(WAVE文件的大小, 不含前8个字节)
|
||||
|
||||
char Format[5]; // "WAVE"标志
|
||||
|
||||
|
||||
|
||||
char SubChunk1ID[5];// "fmt "标志
|
||||
|
||||
unsigned long int SubChunk1Size; /*
|
||||
|
||||
* 过渡字节(不定)
|
||||
|
||||
* 16 for PCM. This is the size of the rest of the
|
||||
|
||||
* Subchunk which follows this number.
|
||||
|
||||
*/
|
||||
|
||||
unsigned short int AudioFormat; /*
|
||||
|
||||
* 格式类别(10H为PCM格式的声音数据)
|
||||
|
||||
* PCM=1 (i.e. Linear quantization)
|
||||
|
||||
* Values other than 1 indicate some form of compression.
|
||||
|
||||
*/
|
||||
|
||||
unsigned short int NumChannels; // 通道数(单声道为1, 双声道为2)
|
||||
|
||||
//unsigned short int SampleRate; // 采样率(每秒样本数), 表示每个通道的播放速度
|
||||
|
||||
unsigned long int SampleRate; // 采样率(每秒样本数), 表示每个通道的播放速度
|
||||
|
||||
unsigned long int ByteRate; /*
|
||||
|
||||
* 波形音频数据传输速率, 其值为:通道数*每秒数据位数*每样本的数据位数/8
|
||||
|
||||
* 播放软件可以利用该值估计缓冲区大小
|
||||
|
||||
*/
|
||||
|
||||
unsigned short int BlockAlign; /*
|
||||
|
||||
* 每样本的数据位数(按字节算), 其值为:通道数*每样本的数据位值/8, 播放
|
||||
|
||||
* 软件需要一次处理多个该值大小的字节数据, 以便将其值用于缓冲区的调整
|
||||
|
||||
*/
|
||||
|
||||
unsigned short int BitsPerSample; /*
|
||||
|
||||
* 每样本的数据位数, 表示每个声道中各个样本的数据位数. 如果有多个声道,
|
||||
|
||||
* 对每个声道而言, 样本大小都一样
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
char SubChunk2ID[5]; // 数据标记"data"
|
||||
|
||||
unsigned long int SubChunk2Size; // 语音数据的长度
|
||||
|
||||
} WAVE;
|
||||
|
||||
/*
|
||||
* pBuffer内部申请空间,需要由外部释放
|
||||
*/
|
||||
|
||||
bool GetWaveHeadInfo(FILE*stream, WAVE& outWavHead);
|
||||
|
||||
#endif /* WAVHEAD_H_ */
|
Loading…
Reference in New Issue