static void omx_mp_init(media_pipe_t *mp) { if(!(mp->mp_flags & MP_VIDEO)) return; mp->mp_seek_initiate = omx_mp_begin_seek; mp->mp_seek_audio_done = omx_mp_seek_audio_done; mp->mp_seek_video_done = omx_mp_seek_video_done; mp->mp_hold_changed = omx_mp_hold_changed; mp->mp_clock_setup = omx_mp_clock_setup; omx_clk_t *clk = calloc(1, sizeof(omx_clk_t)); TAILQ_INIT(&clk->q); clk->mp = mp; clk->c = omx_component_create("OMX.broadcom.clock", &mp->mp_mutex, NULL); hts_cond_init(&clk->cond, &mp->mp_mutex); mp->mp_extra = clk; omx_set_state(clk->c, OMX_StateIdle); omx_clk_do(clk, OMX_CLK_INIT, 1); hts_thread_create_joinable("omxclkctrl", &clk->tid, omx_clk_thread, clk, THREAD_PRIO_DEMUXER); }
video_decoder_t * video_decoder_create(media_pipe_t *mp, vd_frame_deliver_t *frame_delivery, void *opaque) { video_decoder_t *vd = calloc(1, sizeof(video_decoder_t)); vd->vd_frame_deliver = frame_delivery; vd->vd_opaque = opaque; mp_ref_inc(mp); vd->vd_mp = mp; vd_init_timings(vd); #ifdef CONFIG_DVD dvdspu_decoder_init(vd); #endif TAILQ_INIT(&vd->vd_overlay_queue); hts_mutex_init(&vd->vd_overlay_mutex); hts_thread_create_joinable("video decoder", &vd->vd_decoder_thread, vd_thread, vd, THREAD_PRIO_NORMAL); return vd; }
static void omx_mp_init(media_pipe_t *mp) { if(!(mp->mp_flags & MP_VIDEO)) return; #if 0 if(0) { mp->mp_seek_initiate = omx_mp_begin_seek; mp->mp_seek_audio_done = omx_mp_seek_audio_done; mp->mp_seek_video_done = omx_mp_seek_video_done; } #endif mp->mp_hold_changed = omx_mp_hold_changed; omx_clk_t *clk = calloc(1, sizeof(omx_clk_t)); TAILQ_INIT(&clk->q); clk->mp = mp; clk->c = omx_component_create("OMX.broadcom.clock", &mp->mp_mutex, NULL); hts_cond_init(&clk->cond, &mp->mp_mutex); mp->mp_extra = clk; omx_set_state(clk->c, OMX_StateIdle); #if 0 OMX_TIME_CONFIG_CLOCKSTATETYPE cstate; OMX_INIT_STRUCTURE(cstate); cstate.eState = OMX_TIME_ClockStateWaitingForStartTime; cstate.nWaitMask = 1; omxchk(OMX_SetParameter(c->oc_handle, OMX_IndexConfigTimeClockState, &cstate)); OMX_TIME_CONFIG_ACTIVEREFCLOCKTYPE refClock; OMX_INIT_STRUCTURE(refClock); refClock.eClock = OMX_TIME_RefClockAudio; // refClock.eClock = OMX_TIME_RefClockVideo; // refClock.eClock = OMX_TIME_RefClockNone; #else OMX_TIME_CONFIG_CLOCKSTATETYPE cstate; OMX_INIT_STRUCTURE(cstate); cstate.eState = OMX_TIME_ClockStateRunning; omxchk(OMX_SetParameter(clk->c->oc_handle, OMX_IndexConfigTimeClockState, &cstate)); OMX_TIME_CONFIG_ACTIVEREFCLOCKTYPE refClock; OMX_INIT_STRUCTURE(refClock); refClock.eClock = OMX_TIME_RefClockAudio; #endif omxchk(OMX_SetConfig(clk->c->oc_handle, OMX_IndexConfigTimeActiveRefClock, &refClock)); omx_set_state(clk->c, OMX_StateExecuting); hts_thread_create_joinable("omxclkctrl", &clk->tid, omx_clk_thread, clk, THREAD_PRIO_DEMUXER); }
void audio_init(void) { audio_fifo_init(&af0, 16000, 8000); htsmsg_t *m = htsmsg_store_load("audio/current"); if(m == NULL) m = htsmsg_create_map(); audio_mastervol_init(); audio_settings_root = settings_add_dir(NULL, _p("Audio output"), "sound", NULL, _p("Select audio output device and related configurations"), "settings:audio"); audio_settings_current_device = settings_create_multiopt(audio_settings_root, "currentdevice", _p("Current output device"), 0); TAILQ_INIT(&audio_modes); #ifdef CONFIG_LIBOGC audio_wii_init(); #endif #if PS3 audio_ps3_init(); #endif int have_pulse_audio __attribute__((unused)) = 0; #ifdef CONFIG_LIBPULSE have_pulse_audio |= audio_pa_init(); #endif #ifdef CONFIG_LIBASOUND audio_alsa_init(have_pulse_audio); #endif #ifdef CONFIG_COREAUDIO audio_coreaudio_init(); #endif audio_dummy_init(); settings_multiopt_initiate(audio_settings_current_device, audio_change_output_device, NULL, NULL, m, settings_generic_save_settings, (void *)"audio/current"); audio_run = 1; hts_thread_create_joinable("audio output", &audio_thread_id, audio_output_thread, NULL, THREAD_PRIO_HIGH); }
video_playback_t * video_playback_create(media_pipe_t *mp) { video_playback_t *vp = calloc(1, sizeof(video_playback_t)); vp->vp_mp = mp; hts_thread_create_joinable("video player", &vp->vp_thread, video_player_idle, vp, THREAD_PRIO_NORMAL); return vp; }
/** * Create an audio decoder pipeline. * * Called from media.c */ audio_decoder_t * audio_decoder_create(media_pipe_t *mp) { audio_decoder_t *ad; ad = calloc(1, sizeof(audio_decoder_t)); ad->ad_mp = mp; ad->ad_outbuf = halloc(AVCODEC_MAX_AUDIO_FRAME_SIZE * 2); TAILQ_INIT(&ad->ad_hold_queue); hts_thread_create_joinable("audio decoder", &ad->ad_tid, ad_thread, ad, THREAD_PRIO_HIGH); return ad; }
video_decoder_t * video_decoder_create(media_pipe_t *mp) { video_decoder_t *vd = calloc(1, sizeof(video_decoder_t)); vd->vd_mp = mp_retain(mp); vd_init_timings(vd); hts_thread_create_joinable("video decoder", &vd->vd_decoder_thread, vd_thread, vd, THREAD_PRIO_VIDEO); return vd; }
struct audio_decoder * audio_decoder_create(struct media_pipe *mp) { const audio_class_t *ac = audio_class; audio_decoder_t *ad = calloc(1, ac->ac_alloc_size); ad->ad_mp = mp; ad->ad_ac = ac; ad->ad_tile_size = 1024; ad->ad_frame = avcodec_alloc_frame(); ad->ad_pts = AV_NOPTS_VALUE; ad->ad_epoch = 0; hts_thread_create_joinable("audio decoder", &ad->ad_tid, audio_decode_thread, ad, THREAD_PRIO_HIGH); return ad; }
static void enable_test_thread(int on) { if(!generator_tid == !on) return; if(on) { assert(gen_mp == NULL); gen_mp = mp_create("testsignal", MP_PRIMABLE); hts_thread_create_joinable("audiotest", &generator_tid, test_generator_thread, gen_mp, THREAD_PRIO_DEMUXER); } else { event_t *e = event_create_type(EVENT_EXIT); mp_enqueue_event(gen_mp, e); event_release(e); hts_thread_join(&generator_tid); mp_shutdown(gen_mp); mp_ref_dec(gen_mp); gen_mp = NULL; generator_tid = 0; } }