Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
    }
}
Esempio n. 3
0
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);
        }
    }
}