// ---------------------------------------------------------------------------- void ofOpenALSoundPlayer::play(){ std::unique_lock<std::mutex> lock(mutex); int err = glGetError(); // if the sound is set to multiplay, then create new sources, // do not multiplay on loop or we won't be able to stop it if (bMultiPlay && !bLoop){ sources.resize(sources.size()+channels); alGetError(); // Clear error. alGenSources(channels, &sources[sources.size()-channels]); err = alGetError(); if (err != AL_NO_ERROR){ ofLogError("ofOpenALSoundPlayer") << "play(): couldn't create multiplay stereo sources: " << (int) err << " " << getALErrorString(err); return; } for(int i=0;i<channels;i++){ alSourcei (sources[sources.size()-channels+i], AL_BUFFER, buffers[i] ); // only stereo panning if(i==0){ float pos[3] = {-1,0,0}; alSourcefv(sources[sources.size()-channels+i],AL_POSITION,pos); }else{ float pos[3] = {1,0,0}; alSourcefv(sources[sources.size()-channels+i],AL_POSITION,pos); } alSourcef (sources[sources.size()-channels+i], AL_ROLLOFF_FACTOR, 0.0); alSourcei (sources[sources.size()-channels+i], AL_SOURCE_RELATIVE, AL_TRUE); } err = glGetError(); if (err != AL_NO_ERROR){ ofLogError("ofOpenALSoundPlayer") << "play(): couldn't assign multiplay buffers: " << (int) err << " " << getALErrorString(err); return; } } alSourcePlayv(channels,&sources[sources.size()-channels]); if(bMultiPlay){ ofAddListener(ofEvents().update,this,&ofOpenALSoundPlayer::update); } if(isStreaming){ setPosition(0); stream_end = false; startThread(true); } }
void errorCheck( CSulString prefixString ) { ALenum error; if ( (error = alGetError()) != AL_NO_ERROR ) { CSulString s = getALErrorString( error ); std::cout << "ERROR: " << prefixString << " " << s << std::endl; exit(-1); } }
xdl_int XdevLAudioBufferAL::upload(xdl_int8* src, xdl_uint size) { XDEVL_ASSERT( (m_locked == xdl_true), "You must use lock() before you can upload data into the buffer"); // Initialize AL buffer and upload data. alBufferData(m_id, m_format, (ALvoid*)src, size, m_freq); ALenum error = alGetError(); if(error != AL_NO_ERROR) { std::cerr << getALErrorString(error) << std::endl; return RET_FAILED; } m_size = size; return RET_SUCCESS; }
//------------------------------------------------------------ bool ofOpenALSoundPlayer::loadSound(string fileName, bool is_stream){ fileName = ofToDataPath(fileName); bMultiPlay = false; isStreaming = is_stream; int err = AL_NO_ERROR; // [1] init sound systems, if necessary initialize(); // [2] try to unload any previously loaded sounds // & prevent user-created memory leaks // if they call "loadSound" repeatedly, for example unloadSound(); ALenum format=AL_FORMAT_MONO16; bLoadedOk = false; if(!isStreaming){ readFile(fileName, buffer); }else{ stream(fileName, buffer); } int numFrames = buffer.size()/channels; if(isStreaming){ buffers.resize(channels*2); }else{ buffers.resize(channels); } alGenBuffers(buffers.size(), &buffers[0]); if(channels==1){ sources.resize(1); alGenSources(1, &sources[0]); err = alGetError(); if (err != AL_NO_ERROR){ ofLogError("ofOpenALSoundPlayer") << "loadSound(): couldn't generate source for \"" << fileName << "\": " << (int) err << " " << getALErrorString(err); return false; } for(int i=0; i<(int)buffers.size(); i++){ alBufferData(buffers[i],format,&buffer[0],buffer.size()*2,samplerate); err = alGetError(); if (err != AL_NO_ERROR){ ofLogError("ofOpenALSoundPlayer:") << "loadSound(): couldn't create buffer for \"" << fileName << "\": " << (int) err << " " << getALErrorString(err); return false; } if(isStreaming){ stream(fileName,buffer); } } if(isStreaming){ alSourceQueueBuffers(sources[0],buffers.size(),&buffers[0]); }else{ alSourcei (sources[0], AL_BUFFER, buffers[0]); } alSourcef (sources[0], AL_PITCH, 1.0f); alSourcef (sources[0], AL_GAIN, 1.0f); alSourcef (sources[0], AL_ROLLOFF_FACTOR, 0.0); alSourcei (sources[0], AL_SOURCE_RELATIVE, AL_TRUE); }else{ vector<vector<short> > multibuffer; multibuffer.resize(channels); sources.resize(channels); alGenSources(channels, &sources[0]); if(isStreaming){ for(int s=0; s<2;s++){ for(int i=0;i<channels;i++){ multibuffer[i].resize(buffer.size()/channels); for(int j=0;j<numFrames;j++){ multibuffer[i][j] = buffer[j*channels+i]; } alBufferData(buffers[s*2+i],format,&multibuffer[i][0],buffer.size()/channels*2,samplerate); err = alGetError(); if ( err != AL_NO_ERROR){ ofLogError("ofOpenALSoundPlayer") << "loadSound(): couldn't create stereo buffers for \"" << fileName << "\": " << (int) err << " " << getALErrorString(err); return false; } alSourceQueueBuffers(sources[i],1,&buffers[s*2+i]); stream(fileName,buffer); } } }else{ for(int i=0;i<channels;i++){ multibuffer[i].resize(buffer.size()/channels); for(int j=0;j<numFrames;j++){ multibuffer[i][j] = buffer[j*channels+i]; } alBufferData(buffers[i],format,&multibuffer[i][0],buffer.size()/channels*2,samplerate); err = alGetError(); if (err != AL_NO_ERROR){ ofLogError("ofOpenALSoundPlayer") << "loadSound(): couldn't create stereo buffers for \"" << fileName << "\": " << (int) err << " " << getALErrorString(err); return false; } alSourcei (sources[i], AL_BUFFER, buffers[i] ); } } for(int i=0;i<channels;i++){ err = alGetError(); if (err != AL_NO_ERROR){ ofLogError("ofOpenALSoundPlayer") << "loadSound(): couldn't create stereo sources for \"" << fileName << "\": " << (int) err << " " << getALErrorString(err); return false; } // only stereo panning if(i==0){ float pos[3] = {-1,0,0}; alSourcefv(sources[i],AL_POSITION,pos); }else{ float pos[3] = {1,0,0}; alSourcefv(sources[i],AL_POSITION,pos); } alSourcef (sources[i], AL_ROLLOFF_FACTOR, 0.0); alSourcei (sources[i], AL_SOURCE_RELATIVE, AL_TRUE); } } bLoadedOk = true; return bLoadedOk; }