/**************************************************** 連続再生設定 引数 _data = サウンドデータ _size = サウンドデータサイズ _loop = ループ回数(0:無限ループ) ****************************************************/ void SoundPlayer::set_next(const void* _data, u32 _size, int _loop) { if ( sound_data == NULL ) { // すでに鳴り終わっている可能性 play(_data, _size, _loop); return; } void* _file_data; switch ( _size ) { case FILE_ASSET : // assetファイル _file_data = load_asset((char*)_data, &_size); _data = _file_data; break; default : // メモリ _file_data = NULL; break; } switch ( format ) { case FORMAT_WAV : // WAVデータ assert(*((u32*)_data) == 0x46464952); { WaveFormat* _info = (WaveFormat*)_data; sound_data->set_next(new SoundData((char*)((u32)_data + sizeof(WaveFormat)), _info->data_size, _loop, _file_data)); } break; case FORMAT_OGG : // OGGデータ assert(*((u32*)_data) == 0x5367674f); sound_data->set_next(new SoundData((char*)_data, _size, _loop, _file_data)); break; } }
void GameCanvas::load_assets() { assets["arrow"] = load_asset("://ui/szczalka"); assets["obstacle"] = load_asset("://map/wall"); assets["background"] = load_asset("://map/back"); assets["doors"] = load_asset("://map/door"); assets["force_field"] = load_asset("://map/force_field"); assets["ui"] = load_asset("://ui/background"); assets["sky"] = load_asset("://map/sky"); assets["pc"] = load_asset("://map/pc"); assets["big_pc"] = load_asset("://map/big_pc"); assets["ui/labels"] = load_asset("://ui/labels"); // Generate lists to iterate through QStringList hairtypes, states; hairtypes << "blonde" << "brown" << "gray" << "red"; states << "m" << "m_dead" << "f" << "f_dead" << "f_boss"; // iterate through hairtypes and states for (int i=0; i<hairtypes.count(); i++) { for (int j=0; j<states.count(); j++) { // create path QString path = "people/" + hairtypes.at(i) + "/" + states.at(j); // load asset from qrc assets[path] = load_asset("://"+path); } } // load all the pcs QStringList types; types << "bsod" << "av_01" << "av_02" << "broken_01" << "broken_02" << "broken_03" << "fixed_01" << "fixed_02" << "working_03" << "apple" << "net5" << "big_av_01" << "big_av_02" << "big_corrupted"; // iterate through types for (int i=0; i<types.count(); i++) { // load asset from qrc assets["pc_"+types.at(i)] = load_asset("://map/pc_states/"+types.at(i)); } }
/**************************************************** 再生 引数 _data = サウンドデータ _size = サウンドデータサイズ _loop = ループ回数(0:無限ループ) _vol = 音量 ****************************************************/ void SoundPlayer::prepare(const void* _data, u32 _size, int _loop, float _vol) { stop(); void* _file_data; switch ( _size ) { case FILE_ASSET : // assetファイル _file_data = load_asset((char*)_data, &_size); _data = _file_data; break; default : // メモリ _file_data = NULL; break; } SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2}; SLDataFormat_PCM format_pcm; SLDataSource audioSrc = {&loc_bufq, &format_pcm}; switch ( *((u32*)_data) ) { // データフォーマット case 0x46464952 : // WAV { format = FORMAT_WAV; WaveFormat* _info = (WaveFormat*)_data; format_pcm.formatType = SL_DATAFORMAT_PCM; format_pcm.numChannels = (SLuint32)_info->channel; format_pcm.samplesPerSec = (SLuint32)_info->rate*1000; format_pcm.bitsPerSample = (SLuint32)_info->bit; format_pcm.containerSize = (SLuint32)_info->bit; format_pcm.channelMask = (_info->channel == 1) ? SL_SPEAKER_FRONT_CENTER : (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT); format_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; sound_data = new SoundData((char*)((u32)_data + sizeof(WaveFormat)), _info->data_size, _loop, _file_data); } break; case 0x5367674f : // OGG { format = FORMAT_OGG; sound_data = new SoundData((char*)_data, _size, _loop, _file_data); ov_pos = 0; // 現在位置 if ( ::ov_open_callbacks(this, &ov_file, NULL, 0, callbacks) ) { LOGE("ov_open_callbacks ERROR!"); ::ov_clear(&ov_file); delete sound_data; return; } vorbis_info* _info = ::ov_info(&ov_file, -1); format_pcm.formatType = SL_DATAFORMAT_PCM; format_pcm.numChannels = (SLuint32)_info->channels; format_pcm.samplesPerSec = (SLuint32)_info->rate*1000; format_pcm.bitsPerSample = (SLuint32)SL_PCMSAMPLEFORMAT_FIXED_16; format_pcm.containerSize = (SLuint32)SL_PCMSAMPLEFORMAT_FIXED_16; format_pcm.channelMask = (_info->channels == 1) ? SL_SPEAKER_FRONT_CENTER : (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT); format_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; } break; default : assert(FALSE); break; } SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX, outputMixObject}; SLDataSink audioSnk = {&loc_outmix, NULL}; const SLInterfaceID ids[3] = {SL_IID_PLAY, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, SL_IID_VOLUME}; const SLboolean req[3] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE}; SLresult result; result = (*engineEngine)->CreateAudioPlayer(engineEngine, &bqPlayerObject, &audioSrc, &audioSnk, 3, ids, req); if ( SL_RESULT_SUCCESS != result ) { // プレイヤーオブジェクト作成 bqPlayerObject = NULL; return; } result = (*bqPlayerObject)->Realize(bqPlayerObject, SL_BOOLEAN_FALSE); // リアライズ assert(SL_RESULT_SUCCESS == result); result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_PLAY, &bqPlayerPlay); assert(SL_RESULT_SUCCESS == result); // インタフェース取得 result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &bqPlayerBufferQueue); assert(SL_RESULT_SUCCESS == result); // バッファキューインタフェース result = (*bqPlayerObject)->GetInterface(bqPlayerObject, SL_IID_VOLUME, &bqPlayerVolume); assert(SL_RESULT_SUCCESS == result); // 音量インタフェース set_volume(_vol); // 音量設定 switch ( format ) { case FORMAT_WAV : // WAV { result = (*bqPlayerBufferQueue)->RegisterCallback(bqPlayerBufferQueue, bqPlayerCallbackWAV, this); assert(SL_RESULT_SUCCESS == result); // 再生コールバック設定 (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, sound_data->data, (SLuint32)sound_data->size); } break; case FORMAT_OGG : // OGG { result = (*bqPlayerBufferQueue)->RegisterCallback(bqPlayerBufferQueue, bqPlayerCallbackOGG, this); assert(SL_RESULT_SUCCESS == result); // 再生コールバック設定 callback_ogg(); // データ読み込み } break; } state = PREPARED; }