mirror of https://github.com/axmolengine/axmol.git
use Osp::Media::Player for playing effect
remove old AudioOut method
This commit is contained in:
parent
1ffd3a4350
commit
f7bd325d2b
|
@ -1,247 +0,0 @@
|
||||||
/*
|
|
||||||
* 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");
|
|
||||||
}
|
|
|
@ -1,59 +0,0 @@
|
||||||
/*
|
|
||||||
* 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_ */
|
|
|
@ -1,6 +1,4 @@
|
||||||
#include "SimpleAudioEngine.h"
|
#include "SimpleAudioEngine.h"
|
||||||
#include "MyAudioOutListener.h"
|
|
||||||
|
|
||||||
#include <FBase.h>
|
#include <FBase.h>
|
||||||
#include <FMedia.h>
|
#include <FMedia.h>
|
||||||
#include <FSystem.h>
|
#include <FSystem.h>
|
||||||
|
@ -195,7 +193,7 @@ static bool openMediaPlayer(Player*& pPlayer, const char* pszFilePath, bool bLoo
|
||||||
r = pPlayer->OpenFile(strFilePath.c_str(), false);
|
r = pPlayer->OpenFile(strFilePath.c_str(), false);
|
||||||
if (IsFailed(r))
|
if (IsFailed(r))
|
||||||
{
|
{
|
||||||
AppLog("Openfile fails\n");
|
AppLog("Open (%s) fails\n", strFilePath.c_str());
|
||||||
delete pPlayer;
|
delete pPlayer;
|
||||||
pPlayer = NULL;
|
pPlayer = NULL;
|
||||||
break;
|
break;
|
||||||
|
@ -357,6 +355,10 @@ void SimpleAudioEngine::setBackgroundMusicVolume(float volume)
|
||||||
if (s_pBackPlayer)
|
if (s_pBackPlayer)
|
||||||
{
|
{
|
||||||
s_pBackPlayer->SetVolume((int) (volume * 99));
|
s_pBackPlayer->SetVolume((int) (volume * 99));
|
||||||
|
if (volume > 0.0f && s_pBackPlayer->GetVolume() == 0)
|
||||||
|
{
|
||||||
|
s_pBackPlayer->SetVolume(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
AppLog("volume = %f", volume);
|
AppLog("volume = %f", volume);
|
||||||
s_fBackgroundMusicVolume = volume;
|
s_fBackgroundMusicVolume = volume;
|
||||||
|
@ -394,6 +396,11 @@ unsigned int SimpleAudioEngine::playEffect(const char* pszFilePath, bool bLoop/*
|
||||||
if (p != s_List.end())
|
if (p != s_List.end())
|
||||||
{
|
{
|
||||||
p->second->SetVolume((int) (s_fEffectsVolume * 99));
|
p->second->SetVolume((int) (s_fEffectsVolume * 99));
|
||||||
|
if (s_fEffectsVolume > 0.0f && p->second->GetVolume() == 0)
|
||||||
|
{
|
||||||
|
p->second->SetVolume(1);
|
||||||
|
}
|
||||||
|
|
||||||
if (PLAYER_STATE_PLAYING == p->second->GetState())
|
if (PLAYER_STATE_PLAYING == p->second->GetState())
|
||||||
{
|
{
|
||||||
r = p->second->Stop();
|
r = p->second->Stop();
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
|
@ -1,92 +0,0 @@
|
||||||
/*
|
|
||||||
* 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