bool AudioOpenAL::music_open (MusicType type) { int f; size_t count; count = 0; for (size_t mi = 0; mi < music[type].size (); mi++) { count += music[type][mi].played; } if (count == music[type].size ()) { for (size_t mi = 0; mi < music[type].size (); mi++) { music[type][mi].played = false; } count = 0; } while (count < music[type].size ()) { f = random () % music[type].size (); if (!music[type][f].played) { music[type][f].played = true; count++; music_decoder = new MplayerDecoder (); if (music_decoder->open (music[type][f].filename)) { return true; } logger.warnln ("could not play %s", music[type][f].filename.c_str ()); delete music_decoder; music_decoder = NULL; } } return false; }
void AudioPlayer::rotateBufferThread(int offsetFrame) { char* tmpBuffer = nullptr; AudioDecoder* decoder = AudioDecoderManager::createDecoder(_audioCache->_fileFullPath.c_str()); do { BREAK_IF(decoder == nullptr || !decoder->open(_audioCache->_fileFullPath.c_str())); uint32_t framesRead = 0; const uint32_t framesToRead = _audioCache->_queBufferFrames; const uint32_t bufferSize = framesToRead * decoder->getBytesPerFrame(); tmpBuffer = (char*)malloc(bufferSize); memset(tmpBuffer, 0, bufferSize); if (offsetFrame != 0) { decoder->seek(offsetFrame); } ALint sourceState; ALint bufferProcessed = 0; bool needToExitThread = false; while (!_isDestroyed) { alGetSourcei(_alSource, AL_SOURCE_STATE, &sourceState); if (sourceState == AL_PLAYING) { alGetSourcei(_alSource, AL_BUFFERS_PROCESSED, &bufferProcessed); while (bufferProcessed > 0) { bufferProcessed--; if (_timeDirty) { _timeDirty = false; offsetFrame = _currTime * decoder->getSampleRate(); decoder->seek(offsetFrame); } else { _currTime += QUEUEBUFFER_TIME_STEP; if (_currTime > _audioCache->_duration) { if (_loop) { _currTime = 0.0f; } else { _currTime = _audioCache->_duration; } } } framesRead = decoder->readFixedFrames(framesToRead, tmpBuffer); if (framesRead == 0) { if (_loop) { decoder->seek(0); framesRead = decoder->readFixedFrames(framesToRead, tmpBuffer); } else { needToExitThread = true; break; } } ALuint bid; alSourceUnqueueBuffers(_alSource, 1, &bid); alBufferData(bid, _audioCache->_format, tmpBuffer, framesRead * decoder->getBytesPerFrame(), decoder->getSampleRate()); alSourceQueueBuffers(_alSource, 1, &bid); } } std::unique_lock<std::mutex> lk(_sleepMutex); if (_isDestroyed || needToExitThread) { break; } _sleepCondition.wait_for(lk,std::chrono::milliseconds(75)); } } while(false); ALOGV("Exit rotate buffer thread ..."); if (decoder != nullptr) { decoder->close(); } AudioDecoderManager::destroyDecoder(decoder); free(tmpBuffer); _isRotateThreadExited = true; ALOGV("%s exited.\n", __FUNCTION__); }