結論から言ってしまうと、半分妥協で、ある程度目的は達成できたということで備忘録として書いておく。
まずは、問題点として、cocos2d-xでzip内に入っている音源をzipから解凍せずに読みたかったんです。
そこで、調べてみるとどうやらcocos2d-xでは音源の再生にSimpleAudioEngineを使うようだ。
しかし、これ問題があって(私が分からないだけでもしかしたらほんとはやり方あるのかも...)、
引数にバイナリ列を入れて再生、ってのができない!!!
これじゃ、FileUtil::getInstance()->getFileDataFromZipからとってきたデーター再生できないじゃん。わざわざローカルに解凍して読むのも負けた気がするしどうしよう。
ってなり色々考えてもうOpenALで再生機能書けばいいかとなり今に至ります。
この辺を参考にさせていただきました。
http://nullpot.blog.fc2.com/blog-category-16.html
一応以下がコードになっていて
playVoice.h
#import <OpenAL/al.h>
class playVoice{
public:
playVoice();
void decodeBinary(unsigned char* buff, unsigned long bufLength);
void playData();
private:
ALuint dataBuff;
};
playVoice.mm
#include "playVoice.h"
#include <OpenAL/alc.h>
#import <AVFoundation/AVFoundation.h>
playVoice::playVoice(){
ALCdevice *device = alcOpenDevice(NULL);
if(device){
ALCcontext *context = alcCreateContext(device, NULL);
alcMakeContextCurrent(context);
}
}
void playVoice::decodeBinary(unsigned char* buff, unsigned long bufLength){
ALuint buffer;
alGenBuffers(1, &buffer);
alBufferData(buffer, AL_FORMAT_MONO16, buff, bufLength, 44100);
dataBuff = buffer;
}
void playVoice::playData(){
ALuint soundSource;
alGenSources(1, &soundSource);
alSourcei(soundSource, AL_BUFFER, dataBuff);
alSourcePlay(soundSource);
}
それで呼び出し方は
main.cpp
#include "playVoice.h"
#import "external/unzip/unzip.h"
int main()
{
/*
省略
*/
unsigned long pSize=0;
unsigned char* soundData = FileUtils::getInstance()->getFileDataFromZip("zipファイルのパス", "ここに音源ファイルが入るよ", (ssize_t*)&pSize);
unsigned long soundLong = pSize;
playVoice *voice=new playVoice();
voice->decodeBinary(soundData, soundLong);
voice->playData();
}
って感じで再生行いました。
ただ、問題あって音源ファイルがcafじゃないとダメなんだよね。
誰か、mp3から読む方法知ってたら教えてください。