/* Initialize locks */
vlc_mutex_init(&vout->p->picture_lock);
vlc_mutex_init(&vout->p->vfilter_lock);
+ vlc_mutex_init(&vout->p->spu_lock);
/* Attach the new object now so we can use var inheritance below */
vlc_object_attach(vout, object);
/* */
if (vlc_clone(&vout->p->thread, Thread, vout,
VLC_THREAD_PRIORITY_OUTPUT)) {
+ spu_Destroy(vout->p->p_spu);
vlc_object_release(vout);
return NULL;
}
return VoutCreate(object, cfg);
}
-/*****************************************************************************
- * vout_Close: Close a vout created by VoutCreate.
- *****************************************************************************
- * You HAVE to call it on vout created by VoutCreate before vlc_object_release.
- * You should NEVER call it on vout not obtained through VoutCreate
- * (like with vout_Request or vlc_object_find.)
- * You can use vout_CloseAndRelease() as a convenience method.
- *****************************************************************************/
void vout_Close(vout_thread_t *vout)
{
assert(vout);
if (vout->p->input)
spu_Attach(vout->p->p_spu, vout->p->input, false);
- vlc_object_detach(vout->p->p_spu);
vout_snapshot_End(&vout->p->snapshot);
vout_control_PushVoid(&vout->p->control, VOUT_CONTROL_CLEAN);
vlc_join(vout->p->thread, NULL);
+
+ vlc_mutex_lock(&vout->p->spu_lock);
+ spu_Destroy(vout->p->p_spu);
+ vout->p->p_spu = NULL;
+ vlc_mutex_unlock(&vout->p->spu_lock);
}
/* */
free(vout->p->splitter_name);
- /* */
- spu_Destroy(vout->p->p_spu);
-
/* Destroy the locks */
+ vlc_mutex_destroy(&vout->p->spu_lock);
vlc_mutex_destroy(&vout->p->picture_lock);
vlc_mutex_destroy(&vout->p->vfilter_lock);
vout_control_Clean(&vout->p->control);
{
int channel = SPU_DEFAULT_CHANNEL;
- vout_control_cmd_t cmd;
- vout_control_cmd_Init(&cmd, VOUT_CONTROL_REGISTER_SUBPICTURE);
- cmd.u.integer_ptr = &channel;
-
- vout_control_Push(&vout->p->control, &cmd);
- vout_control_WaitEmpty(&vout->p->control);
+ vlc_mutex_lock(&vout->p->spu_lock);
+ if (vout->p->p_spu)
+ channel = spu_RegisterChannel(vout->p->p_spu);
+ vlc_mutex_unlock(&vout->p->spu_lock);
return channel;
}
vout_control_PushString(&vout->p->control, VOUT_CONTROL_CHANGE_SUB_FILTERS,
filters);
}
+void vout_ControlChangeSubMargin(vout_thread_t *vout, int margin)
+{
+ vout_control_PushInteger(&vout->p->control, VOUT_CONTROL_CHANGE_SUB_MARGIN,
+ margin);
+}
/* */
static void VoutGetDisplayCfg(vout_thread_t *vout, vout_display_cfg_t *cfg, const char *title)
spu_DisplaySubpicture(vout->p->p_spu, subpicture);
}
-static void ThreadRegisterSubpicture(vout_thread_t *vout, int *channel)
-{
- *channel = spu_RegisterChannel(vout->p->p_spu);
-}
-
static void ThreadFlushSubpicture(vout_thread_t *vout, int channel)
{
spu_ClearChannel(vout->p->p_spu, channel);
{
spu_ChangeFilters(vout->p->p_spu, filters);
}
+static void ThreadChangeSubMargin(vout_thread_t *vout, int margin)
+{
+ spu_ChangeMargin(vout->p->p_spu, margin);
+}
static void ThreadChangePause(vout_thread_t *vout, bool is_paused, mtime_t date)
{
case VOUT_CONTROL_FLUSH_SUBPICTURE:
ThreadFlushSubpicture(vout, cmd.u.integer);
break;
- case VOUT_CONTROL_REGISTER_SUBPICTURE:
- ThreadRegisterSubpicture(vout, cmd.u.integer_ptr);
- break;
case VOUT_CONTROL_OSD_TITLE:
ThreadDisplayOsdTitle(vout, cmd.u.string);
break;
case VOUT_CONTROL_CHANGE_SUB_FILTERS:
ThreadChangeSubFilters(vout, cmd.u.string);
break;
+ case VOUT_CONTROL_CHANGE_SUB_MARGIN:
+ ThreadChangeSubMargin(vout, cmd.u.integer);
+ break;
case VOUT_CONTROL_PAUSE:
ThreadChangePause(vout, cmd.u.pause.is_on, cmd.u.pause.date);
break;