C++
OpenAL
cocos2d-x

Cocos2d-xでのバイナリ列の音源再生

More than 3 years have passed since last update.

結論から言ってしまうと、半分妥協で、ある程度目的は達成できたということで備忘録として書いておく。

まずは、問題点として、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から読む方法知ってたら教えてください。