LoginSignup
2
3

More than 5 years have passed since last update.

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

Posted at

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

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

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3