bool PlayStream::setPosition(unsigned samples) { #ifdef RPLAYSTREAM_SHOW_SLOTS printf("setPosition(%d) -- Card: %d Stream: %d\n",samples, card_number,stream_number); #endif // RPLAYSTREAM_SHOW_SLOTS if((samples<0)||(samples>getSampleLength())) { return false; } if(playing&&((unsigned)samples!=(samples_skipped+samples_played))) { restart_transport=true; pause(); } if(!playing) { if(is_paused) { is_paused=false; repositioned=true; } HPICall(HPI_OutStreamReset(NULL,hpi_stream)); samples_played=0; switch(getFormatTag()) { case WAVE_FORMAT_PCM: case WAVE_FORMAT_VORBIS: samples_skipped= (unsigned)((double)getBlockAlign()* ((double)samples/(double)getBlockAlign())); seekWave((int)((double)samples_skipped*(double)getBlockAlign()), SEEK_SET); break; case WAVE_FORMAT_MPEG: samples_skipped= (unsigned)((double)getBlockAlign()* ((double)samples/(double)getBlockAlign())); seekWave((int)((double)(getAvgBytesPerSec())* ((double)(samples_skipped)/ ((double)getSamplesPerSec()))), SEEK_SET); break; } emit position(samples); } if(restart_transport) { play(); restart_transport=false; } return true; }
// ---------------------------------------------------------------------------- int RiffWavReader::getSamples(void* buf, const size_t& count) { return getStream(buf, count * getBlockAlign()); }