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; }
UInt32 MODDecoder::ReadAudio(AudioBufferList *bufferList, UInt32 frameCount) { if(!IsOpen() || NULL == bufferList || bufferList->mBuffers[0].mNumberChannels != mFormat.mChannelsPerFrame || 0 == frameCount) return 0; // EOF reached if(duh_sigrenderer_get_position(dsr) > mTotalFrames) return 0; long framesRendered = duh_render(dsr, DUMB_BIT_DEPTH, 0, 1, static_cast<float>(65536.0 / DUMB_SAMPLE_RATE), frameCount, bufferList->mBuffers[0].mData); mCurrentFrame += framesRendered; return static_cast<UInt32>(framesRendered); }
static int cdumb_seek (DB_fileinfo_t *_info, float time) { trace ("cdumb_read seek %f\n", time); dumb_info_t *info = (dumb_info_t *)_info; if (time < _info->readpos) { if (cdumb_startrenderer (_info) < 0) { return -1; } } else { time -= _info->readpos; } int pos = time * _info->fmt.samplerate; duh_sigrenderer_generate_samples (info->renderer, 0, 65536.0f / _info->fmt.samplerate, pos, NULL); _info->readpos = duh_sigrenderer_get_position (info->renderer) / 65536.f; return 0; }
// This is called from SDL2, and should read data from a source and hand it over // to SDL2 via the stream buffer. void stream_audio(void *userdata, Uint8 *stream, int len) { streamer_t *streamer = (streamer_t *)userdata; // Read samples from libdumb save them to the SDL buffer. Note that we are // reading SAMPLES, not bytes! int r_samples = len / streamer->sbytes; int got = duh_render_int(streamer->renderer, &streamer->sig_samples, &streamer->sig_samples_size, streamer->bits, 0, streamer->volume, streamer->delta, r_samples, stream); if (got == 0) { streamer->ended = true; } // Get current position from libdumb for the playback display. If we get // position that is 0, it probably means that the song ended and // duh_sigrenderer_get_position points to the start of the file. streamer->spos = duh_sigrenderer_get_position(streamer->renderer); if (streamer->spos == 0) { streamer->spos = streamer->ssize; } }
UInt32 SFB::Audio::MODDecoder::_ReadAudio(AudioBufferList *bufferList, UInt32 frameCount) { if(bufferList->mBuffers[0].mNumberChannels != mFormat.mChannelsPerFrame) { LOGGER_WARNING("org.sbooth.AudioEngine.Decoder.MOD", "_ReadAudio() called with invalid parameters"); return 0; } // EOF reached if(duh_sigrenderer_get_position(dsr.get()) > mTotalFrames) { bufferList->mBuffers[0].mDataByteSize = 0; return 0; } long framesRendered = duh_render(dsr.get(), DUMB_BIT_DEPTH, 0, 1, 65536.0f / DUMB_SAMPLE_RATE, frameCount, bufferList->mBuffers[0].mData); mCurrentFrame += framesRendered; bufferList->mBuffers[0].mDataByteSize = (UInt32)(framesRendered * mFormat.mBytesPerFrame); bufferList->mBuffers[0].mNumberChannels = mFormat.mChannelsPerFrame; return (UInt32)framesRendered; }
/* DEPRECATED */ long duh_renderer_get_position(DUH_SIGRENDERER *dr) { return duh_sigrenderer_get_position(dr); }
long dumba5_get_player_position(DUMBA5_PLAYER * pp) { return pp ? duh_sigrenderer_get_position(pp->sigrenderer) : -1; }
long al_duh_get_position(AL_DUH_PLAYER *dp) { return dp ? duh_sigrenderer_get_position(dp->sigrenderer) : -1; }