unsigned int speex_dec_read(decoder_t * dec, float * dest, int num) { speex_pdata_t * pd = (speex_pdata_t *)dec->pdata; unsigned int numread = 0; unsigned int n_avail = 0; while ((rb_read_space(pd->rb) < num * pd->channels * sample_size) && (!pd->is_eos)) { pd->is_eos = decode_speex(dec); } n_avail = rb_read_space(pd->rb) / (pd->channels * sample_size); if (n_avail > num) n_avail = num; rb_read(pd->rb, (char *)dest, n_avail * pd->channels * sample_size); numread = n_avail; return numread; }
gint cdda_timeout_callback(gpointer data) { cdda_notify_t notify; while (rb_read_space(cdda_notify_rb) >= sizeof(cdda_notify_t)) { rb_read(cdda_notify_rb, (char *)¬ify, sizeof(cdda_notify_t)); switch (notify.event_type) { case CDDA_EVENT_NEW_DRIVE: AQUALUNG_MUTEX_LOCK(cdda_mutex) insert_cdda_drive_node(notify.device_path); AQUALUNG_MUTEX_UNLOCK(cdda_mutex) free(notify.device_path); break; case CDDA_EVENT_CHANGED_DRIVE: AQUALUNG_MUTEX_LOCK(cdda_mutex) refresh_cdda_drive_node(notify.device_path); AQUALUNG_MUTEX_UNLOCK(cdda_mutex) free(notify.device_path); break; case CDDA_EVENT_REMOVED_DRIVE: AQUALUNG_MUTEX_LOCK(cdda_mutex) remove_cdda_drive_node(notify.device_path); AQUALUNG_MUTEX_UNLOCK(cdda_mutex) free(notify.device_path); break; } } return TRUE; }
void pause_vorbis_stream(decoder_t * dec) { vorbis_pdata_t * pd = (vorbis_pdata_t *)dec->pdata; char flush_dest; httpc_close(pd->session); if (pd->session->type == HTTPC_SESSION_STREAM) { /* empty vorbis decoder ringbuffer */ while (rb_read_space(pd->rb)) rb_read(pd->rb, &flush_dest, sizeof(char)); } }
void vorbis_decoder_seek(decoder_t * dec, unsigned long long seek_to_pos) { vorbis_pdata_t * pd = (vorbis_pdata_t *)dec->pdata; file_decoder_t * fdec = dec->fdec; char flush_dest; if (fdec->is_stream && pd->session->type != HTTPC_SESSION_NORMAL) return; if (ov_pcm_seek(&(pd->vf), seek_to_pos) == 0) { fdec->samples_left = fdec->fileinfo.total_samples - seek_to_pos; /* empty vorbis decoder ringbuffer */ while (rb_read_space(pd->rb)) rb_read(pd->rb, &flush_dest, sizeof(char)); } else { fprintf(stderr, "vorbis_decoder_seek: warning: ov_pcm_seek() failed\n"); } }
size_t rb_peek (rb_t * rb, char *dest, size_t cnt) { size_t free_cnt; size_t cnt2; size_t to_read; size_t n1, n2; size_t tmp_read_ptr; tmp_read_ptr = rb->read_ptr; if ((free_cnt = rb_read_space (rb)) == 0) { return 0; } to_read = cnt > free_cnt ? free_cnt : cnt; cnt2 = tmp_read_ptr + to_read; if (cnt2 > rb->size) { n1 = rb->size - tmp_read_ptr; n2 = cnt2 & rb->size_mask; } else { n1 = to_read; n2 = 0; } memcpy (dest, &(rb->buf[tmp_read_ptr]), n1); tmp_read_ptr += n1; tmp_read_ptr &= rb->size_mask; if (n2) { memcpy (dest + n1, &(rb->buf[tmp_read_ptr]), n2); tmp_read_ptr += n2; tmp_read_ptr &= rb->size_mask; } return to_read; }
void speex_dec_seek(decoder_t * dec, unsigned long long seek_to_pos) { speex_pdata_t * pd = (speex_pdata_t *)dec->pdata; file_decoder_t * fdec = dec->fdec; char flush_dest; if (seek_to_pos == fdec->fileinfo.total_samples) --seek_to_pos; if (oggz_seek_units(pd->oggz, seek_to_pos / (float)pd->sample_rate * 1000.0f, SEEK_SET) != -1) { if (seek_to_pos == 0) { pd->packetno = 0; } fdec->samples_left = fdec->fileinfo.total_samples - seek_to_pos; /* empty speex decoder ringbuffer */ while (rb_read_space(pd->rb)) rb_read(pd->rb, &flush_dest, sizeof(char)); } else { fprintf(stderr, "speex_dec_seek(): warning: oggz_seek_units() returned -1\n"); } }