/***************************************************************************** * aout_New: initialize aout structure *****************************************************************************/ aout_instance_t * __aout_New( vlc_object_t * p_parent ) { aout_instance_t * p_aout; /* Allocate descriptor. */ p_aout = vlc_custom_create( p_parent, sizeof( *p_aout ), VLC_OBJECT_AOUT, "audio output" ); if( p_aout == NULL ) { return NULL; } /* Initialize members. */ vlc_mutex_init( &p_aout->input_fifos_lock ); vlc_mutex_init( &p_aout->mixer_lock ); vlc_mutex_init( &p_aout->volume_vars_lock ); vlc_mutex_init( &p_aout->output_fifo_lock ); p_aout->p_input = NULL; p_aout->mixer_multiplier = 1.0; p_aout->p_mixer = NULL; p_aout->output.b_starving = 1; p_aout->output.p_module = NULL; var_Create( p_aout, "intf-change", VLC_VAR_VOID ); vlc_object_set_destructor( p_aout, aout_Destructor ); return p_aout; }
/** * Registers a new session with the announce handler, using a pregenerated SDP * * \param obj a VLC object * \param psz_sdp the SDP to register * \param psz_dst session address (needed for SAP address auto detection) * \param p_method an announce method descriptor * \return the new session descriptor structure */ session_descriptor_t * sout_AnnounceRegisterSDP( vlc_object_t *obj, const char *psz_sdp, const char *psz_dst, announce_method_t *p_method ) { assert (p_method == &sap_method); (void) p_method; session_descriptor_t *p_session = calloc( 1, sizeof (*p_session) ); if( !p_session ) return NULL; p_session->psz_sdp = strdup( psz_sdp ); /* GRUIK. We should not convert back-and-forth from string to numbers */ struct addrinfo *res; if (vlc_getaddrinfo (obj, psz_dst, 0, NULL, &res) == 0) { if (res->ai_addrlen <= sizeof (p_session->addr)) memcpy (&p_session->addr, res->ai_addr, p_session->addrlen = res->ai_addrlen); vlc_freeaddrinfo (res); } vlc_mutex_lock (&sap_mutex); sap_handler_t *p_sap = libvlc_priv (obj->p_libvlc)->p_sap; if (p_sap == NULL) { p_sap = SAP_Create (VLC_OBJECT (obj->p_libvlc)); libvlc_priv (obj->p_libvlc)->p_sap = p_sap; vlc_object_set_destructor ((vlc_object_t *)p_sap, sap_destroy); } else vlc_object_hold ((vlc_object_t *)p_sap); vlc_mutex_unlock (&sap_mutex); if (p_sap == NULL) goto error; msg_Dbg (obj, "adding SAP session"); if (SAP_Add (p_sap, p_session)) { vlc_mutex_lock (&sap_mutex); vlc_object_release ((vlc_object_t *)p_sap); vlc_mutex_unlock (&sap_mutex); goto error; } return p_session; error: free (p_session->psz_sdp); free (p_session); return NULL; }
/*******************************************************************//** * Create a Service discovery ***********************************************************************/ services_discovery_t *vlc_sd_Create( vlc_object_t *p_super, const char *cfg ) { services_discovery_t *p_sd; p_sd = vlc_custom_create( p_super, sizeof( *p_sd ), "services discovery" ); if( !p_sd ) return NULL; free(config_ChainCreate( &p_sd->psz_name, &p_sd->p_cfg, cfg )); vlc_event_manager_t *em = &p_sd->event_manager; vlc_event_manager_init( em, p_sd ); vlc_event_manager_register_event_type(em, vlc_ServicesDiscoveryItemAdded); vlc_event_manager_register_event_type(em, vlc_ServicesDiscoveryItemRemoved); vlc_event_manager_register_event_type(em, vlc_ServicesDiscoveryItemRemoveAll); vlc_event_manager_register_event_type(em, vlc_ServicesDiscoveryStarted); vlc_event_manager_register_event_type(em, vlc_ServicesDiscoveryEnded); vlc_object_set_destructor( p_sd, services_discovery_Destructor ); return p_sd; }
/** * Create the interface, and prepare it for main loop. * * \param p_this the calling vlc_object_t * \param psz_module a preferred interface module * \return a pointer to the created interface thread, NULL on error */ intf_thread_t* __intf_Create( vlc_object_t *p_this, const char *psz_module ) { intf_thread_t * p_intf; /* Allocate structure */ p_intf = vlc_object_create( p_this, VLC_OBJECT_INTF ); if( !p_intf ) return NULL; p_intf->b_interaction = false; #if defined( __APPLE__ ) || defined( WIN32 ) p_intf->b_should_run_on_first_thread = false; #endif /* Choose the best module */ p_intf->psz_intf = strdup( psz_module ); p_intf->p_module = module_Need( p_intf, "interface", psz_module, false ); if( p_intf->p_module == NULL ) { msg_Err( p_intf, "no suitable interface module" ); free( p_intf->psz_intf ); vlc_object_release( p_intf ); return NULL; } /* Initialize structure */ p_intf->b_menu = false; p_intf->b_menu_change = false; /* Initialize mutexes */ vlc_mutex_init( &p_intf->change_lock ); /* Attach interface to its parent object */ vlc_object_attach( p_intf, p_this ); vlc_object_set_destructor( p_intf, intf_Destroy ); return p_intf; }
/** * Creates an audio output object and initializes an output module. */ audio_output_t *aout_New (vlc_object_t *parent) { vlc_value_t val, text; audio_output_t *aout = vlc_custom_create (parent, sizeof (aout_instance_t), "audio output"); if (unlikely(aout == NULL)) return NULL; aout_owner_t *owner = aout_owner (aout); vlc_mutex_init (&owner->lock); vlc_mutex_init (&owner->req.lock); vlc_mutex_init (&owner->dev.lock); owner->req.device = (char *)unset_str; owner->req.volume = -1.f; owner->req.mute = -1; vlc_object_set_destructor (aout, aout_Destructor); /* Audio output module callbacks */ var_Create (aout, "volume", VLC_VAR_FLOAT); var_AddCallback (aout, "volume", var_Copy, parent); var_Create (aout, "mute", VLC_VAR_BOOL | VLC_VAR_DOINHERIT); var_AddCallback (aout, "mute", var_Copy, parent); var_Create (aout, "device", VLC_VAR_STRING); aout->event.volume_report = aout_VolumeNotify; aout->event.mute_report = aout_MuteNotify; aout->event.policy_report = aout_PolicyNotify; aout->event.device_report = aout_DeviceNotify; aout->event.hotplug_report = aout_HotplugNotify; aout->event.gain_request = aout_GainNotify; aout->event.restart_request = aout_RestartNotify; /* Audio output module initialization */ aout->start = NULL; aout->stop = NULL; aout->volume_set = NULL; aout->mute_set = NULL; aout->device_select = NULL; owner->module = module_need (aout, "audio output", "$aout", false); if (owner->module == NULL) { msg_Err (aout, "no suitable audio output module"); vlc_object_release (aout); return NULL; } /* * Persistent audio output variables */ module_config_t *cfg; char *str; /* Visualizations */ var_Create (aout, "visual", VLC_VAR_STRING | VLC_VAR_HASCHOICE); text.psz_string = _("Visualizations"); var_Change (aout, "visual", VLC_VAR_SETTEXT, &text, NULL); val.psz_string = (char *)""; text.psz_string = _("Disable"); var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); val.psz_string = (char *)"spectrometer"; text.psz_string = _("Spectrometer"); var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); val.psz_string = (char *)"scope"; text.psz_string = _("Scope"); var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); val.psz_string = (char *)"spectrum"; text.psz_string = _("Spectrum"); var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); val.psz_string = (char *)"vuMeter"; text.psz_string = _("Vu meter"); var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); /* Look for goom plugin */ if (module_exists ("goom")) { val.psz_string = (char *)"goom"; text.psz_string = (char *)"Goom"; var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); } /* Look for libprojectM plugin */ if (module_exists ("projectm")) { val.psz_string = (char *)"projectm"; text.psz_string = (char*)"projectM"; var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); } /* Look for VSXu plugin */ if (module_exists ("vsxu")) { val.psz_string = (char *)"vsxu"; text.psz_string = (char*)"Vovoid VSXu"; var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); } /* Look for glspectrum plugin */ if (module_exists ("glspectrum")) { val.psz_string = (char *)"glspectrum"; text.psz_string = (char*)"3D spectrum"; var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); } str = var_GetNonEmptyString (aout, "effect-list"); if (str != NULL) { var_SetString (aout, "visual", str); free (str); } /* Equalizer */ var_Create (aout, "equalizer", VLC_VAR_STRING | VLC_VAR_HASCHOICE); text.psz_string = _("Equalizer"); var_Change (aout, "equalizer", VLC_VAR_SETTEXT, &text, NULL); val.psz_string = (char*)""; text.psz_string = _("Disable"); var_Change (aout, "equalizer", VLC_VAR_ADDCHOICE, &val, &text); cfg = config_FindConfig (VLC_OBJECT(aout), "equalizer-preset"); if (likely(cfg != NULL)) for (unsigned i = 0; i < cfg->list_count; i++) { val.psz_string = cfg->list.psz[i]; text.psz_string = vlc_gettext(cfg->list_text[i]); var_Change (aout, "equalizer", VLC_VAR_ADDCHOICE, &val, &text); } var_Create (aout, "audio-filter", VLC_VAR_STRING | VLC_VAR_DOINHERIT); text.psz_string = _("Audio filters"); var_Change (aout, "audio-filter", VLC_VAR_SETTEXT, &text, NULL); var_Create (aout, "audio-visual", VLC_VAR_STRING | VLC_VAR_DOINHERIT); text.psz_string = _("Audio visualizations"); var_Change (aout, "audio-visual", VLC_VAR_SETTEXT, &text, NULL); /* Replay gain */ var_Create (aout, "audio-replay-gain-mode", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); text.psz_string = _("Replay gain"); var_Change (aout, "audio-replay-gain-mode", VLC_VAR_SETTEXT, &text, NULL); cfg = config_FindConfig (VLC_OBJECT(aout), "audio-replay-gain-mode"); if (likely(cfg != NULL)) for (unsigned i = 0; i < cfg->list_count; i++) { val.psz_string = cfg->list.psz[i]; text.psz_string = vlc_gettext(cfg->list_text[i]); var_Change (aout, "audio-replay-gain-mode", VLC_VAR_ADDCHOICE, &val, &text); } var_Create (aout, "equalizer-preamp", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT); var_Create (aout, "equalizer-bands", VLC_VAR_STRING | VLC_VAR_DOINHERIT); return aout; }
/** * Create the main playlist thread * Additionally to the playlist, this thread controls : * - Statistics * - VLM * \param p_parent * \return an object with a started thread */ void __playlist_ThreadCreate( vlc_object_t *p_parent ) { playlist_t *p_playlist = playlist_Create( p_parent ); if( !p_playlist ) return; // Preparse static const char ppname[] = "preparser"; p_playlist->p_preparse = vlc_custom_create( p_playlist, sizeof( playlist_preparse_t ), VLC_OBJECT_GENERIC, ppname ); if( !p_playlist->p_preparse ) { msg_Err( p_playlist, "unable to create preparser" ); vlc_object_release( p_playlist ); return; } p_playlist->p_preparse->i_waiting = 0; p_playlist->p_preparse->pp_waiting = NULL; vlc_object_set_destructor( p_playlist->p_preparse, PreparseDestructor ); vlc_object_attach( p_playlist->p_preparse, p_playlist ); if( vlc_thread_create( p_playlist->p_preparse, "preparser", RunPreparse, VLC_THREAD_PRIORITY_LOW, true ) ) { msg_Err( p_playlist, "cannot spawn preparse thread" ); vlc_object_release( p_playlist->p_preparse ); return; } // Secondary Preparse static const char fname[] = "fetcher"; p_playlist->p_fetcher = vlc_custom_create( p_playlist, sizeof( playlist_fetcher_t ), VLC_OBJECT_GENERIC, fname ); if( !p_playlist->p_fetcher ) { msg_Err( p_playlist, "unable to create secondary preparser" ); vlc_object_release( p_playlist ); return; } p_playlist->p_fetcher->i_waiting = 0; p_playlist->p_fetcher->pp_waiting = NULL; p_playlist->p_fetcher->i_art_policy = var_CreateGetInteger( p_playlist, "album-art" ); vlc_object_set_destructor( p_playlist->p_fetcher, FetcherDestructor ); vlc_object_attach( p_playlist->p_fetcher, p_playlist ); if( vlc_thread_create( p_playlist->p_fetcher, "fetcher", RunFetcher, VLC_THREAD_PRIORITY_LOW, true ) ) { msg_Err( p_playlist, "cannot spawn secondary preparse thread" ); vlc_object_release( p_playlist->p_fetcher ); return; } // Start the thread if( vlc_thread_create( p_playlist, "playlist", RunControlThread, VLC_THREAD_PRIORITY_LOW, true ) ) { msg_Err( p_playlist, "cannot spawn playlist thread" ); vlc_object_release( p_playlist ); return; } /* The object has been initialized, now attach it */ vlc_object_attach( p_playlist, p_parent ); return; }
/***************************************************************************** * aout_New: initialize aout structure *****************************************************************************/ audio_output_t *aout_New( vlc_object_t * p_parent ) { audio_output_t *aout = vlc_custom_create (p_parent, sizeof (aout_instance_t), "audio output"); if (unlikely(aout == NULL)) return NULL; aout_owner_t *owner = aout_owner (aout); vlc_mutex_init (&owner->lock); owner->module = NULL; owner->input = NULL; vlc_mutex_init (&owner->volume.lock); owner->volume.multiplier = 1.0; owner->volume.mixer = NULL; aout->pf_play = aout_DecDeleteBuffer; aout_VolumeNoneInit (aout); vlc_object_set_destructor (aout, aout_Destructor); /* * Persistent audio output variables */ vlc_value_t val, text; char *str; var_Create (aout, "intf-change", VLC_VAR_VOID); /* Visualizations */ var_Create (aout, "visual", VLC_VAR_STRING | VLC_VAR_HASCHOICE); text.psz_string = _("Visualizations"); var_Change (aout, "visual", VLC_VAR_SETTEXT, &text, NULL); val.psz_string = (char *)""; text.psz_string = _("Disable"); var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); val.psz_string = (char *)"spectrometer"; text.psz_string = _("Spectrometer"); var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); val.psz_string = (char *)"scope"; text.psz_string = _("Scope"); var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); val.psz_string = (char *)"spectrum"; text.psz_string = _("Spectrum"); var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); val.psz_string = (char *)"vuMeter"; text.psz_string = _("Vu meter"); var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); /* Look for goom plugin */ if (module_exists ("goom")) { val.psz_string = (char *)"goom"; text.psz_string = (char *)"Goom"; var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); } /* Look for libprojectM plugin */ if (module_exists ("projectm")) { val.psz_string = (char *)"projectm"; text.psz_string = (char*)"projectM"; var_Change (aout, "visual", VLC_VAR_ADDCHOICE, &val, &text); } str = var_GetNonEmptyString (aout, "effect-list"); if (str != NULL) { var_SetString (aout, "visual", str); free (str); } /* Equalizer */ var_Create (aout, "equalizer", VLC_VAR_STRING | VLC_VAR_HASCHOICE); text.psz_string = _("Equalizer"); var_Change (aout, "equalizer", VLC_VAR_SETTEXT, &text, NULL); val.psz_string = (char*)""; text.psz_string = _("Disable"); var_Change (aout, "equalizer", VLC_VAR_ADDCHOICE, &val, &text); { module_config_t *cfg = config_FindConfig (VLC_OBJECT(aout), "equalizer-preset"); if (cfg != NULL) for (int i = 0; i < cfg->i_list; i++) { val.psz_string = (char *)cfg->ppsz_list[i]; text.psz_string = (char *)cfg->ppsz_list_text[i]; var_Change (aout, "equalizer", VLC_VAR_ADDCHOICE, &val, &text); } } var_Create (aout, "audio-filter", VLC_VAR_STRING | VLC_VAR_DOINHERIT); text.psz_string = _("Audio filters"); var_Change (aout, "audio-filter", VLC_VAR_SETTEXT, &text, NULL); var_Create (aout, "audio-visual", VLC_VAR_STRING | VLC_VAR_DOINHERIT); text.psz_string = _("Audio visualizations"); var_Change (aout, "audio-visual", VLC_VAR_SETTEXT, &text, NULL); /* Replay gain */ var_Create (aout, "audio-replay-gain-mode", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); text.psz_string = _("Replay gain"); var_Change (aout, "audio-replay-gain-mode", VLC_VAR_SETTEXT, &text, NULL); { module_config_t *cfg = config_FindConfig (VLC_OBJECT(aout), "audio-replay-gain-mode"); if( cfg != NULL ) for (int i = 0; i < cfg->i_list; i++) { val.psz_string = (char *)cfg->ppsz_list[i]; text.psz_string = (char *)cfg->ppsz_list_text[i]; var_Change (aout, "audio-replay-gain-mode", VLC_VAR_ADDCHOICE, &val, &text); } } return aout; }