int dumb_source_update(audio_source *src, char *buffer, int len) { dumb_source *local = source_get_userdata(src); // Get deltatime and bitrate float delta = 65536.0f / source_get_frequency(src); int bps = source_get_channels(src) * source_get_bytes(src); // If looping is off, and if we have played the whole file, stop here. long pos = duh_sigrenderer_get_position(local->renderer); if(pos < local->vpos && !src->loop) { return 0; } local->vpos = pos; // ... otherwise get more data. int ret = duh_render_int( local->renderer, &local->sig_samples, &local->sig_samples_size, source_get_bytes(src) * 8, // Bits 0, // Unsign 1.0f, // Volume delta, len / bps, // Size buffer ) * bps; return ret; }
void openal_stream_play(audio_stream *stream) { openal_stream *local = stream_get_userdata(stream); // Fill initial buffers char buf[AUDIO_BUFFER_SIZE]; for(int i = 0; i < AUDIO_BUFFER_COUNT; i++) { int ret = source_update(stream->src, buf, AUDIO_BUFFER_SIZE); if(ret > 0) { alBufferData( local->buffers[i], local->format, buf, ret, source_get_frequency(stream->src)); alSourceQueueBuffers(local->source, 1, &local->buffers[i]); } } // Set volume etc. openal_stream_apply(stream); // Start playback alSourcePlay(local->source); int err = alGetError(); if(err != AL_NO_ERROR) { PERROR("OpenAL Stream: Source playback error: %d.", err); } }
void openal_stream_update(audio_stream *stream) { openal_stream *local = stream_get_userdata(stream); // See if we have any empty buffers to fill int val; alGetSourcei(local->source, AL_BUFFERS_PROCESSED, &val); if(val <= 0) { return; } // Handle buffer filling and loading char buf[AUDIO_BUFFER_SIZE]; ALuint n; while(val--) { // Fill buffer & re-queue int ret = source_update(stream->src, buf, AUDIO_BUFFER_SIZE); if(ret > 0) { alSourceUnqueueBuffers(local->source, 1, &n); alBufferData(n, local->format, buf, ret, source_get_frequency(stream->src)); alSourceQueueBuffers(local->source, 1, &n); // Check for any errors int err = alGetError(); if(err != AL_NO_ERROR) { PERROR("OpenAL Stream: Error %d while buffering!", err); } } else { stream_set_finished(stream); break; } } // Make sure we are playing stream if(stream_get_status(stream) == STREAM_STATUS_PLAYING) { ALenum state; alGetSourcei(local->source, AL_SOURCE_STATE, &state); if(state != AL_PLAYING) { alSourcePlay(local->source); } } }