Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-2-2
Commits
63aac9bf
Commit
63aac9bf
authored
Jan 08, 2004
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* ncurses: added and updated a lot of fonctionnalities. (Playlist browser,
time, informations and help display).
parent
e1f5cdc4
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
724 additions
and
274 deletions
+724
-274
modules/gui/ncurses/ncurses.c
modules/gui/ncurses/ncurses.c
+724
-274
No files found.
modules/gui/ncurses/ncurses.c
View file @
63aac9bf
...
...
@@ -2,9 +2,10 @@
* ncurses.c : NCurses plugin for vlc
*****************************************************************************
* Copyright (C) 2001, 2002, 2003 VideoLAN
* $Id: ncurses.c,v 1.
6 2003/12/22 14:32:56 sam
Exp $
* $Id: ncurses.c,v 1.
7 2004/01/08 16:28:37 fenrir
Exp $
*
* Authors: Sam Hocevar <sam@zoy.org>
* Laurent Aimar <fenrir@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
...
...
@@ -55,20 +56,11 @@ static int Open ( vlc_object_t * );
static
void
Close
(
vlc_object_t
*
);
static
void
Run
(
intf_thread_t
*
);
static
void
FullScreen
(
intf_thread_t
*
);
static
void
Play
(
intf_thread_t
*
);
static
void
Stop
(
intf_thread_t
*
);
static
void
Next
(
intf_thread_t
*
);
static
void
PlayPause
(
intf_thread_t
*
);
static
void
Eject
(
intf_thread_t
*
);
static
void
Pause
(
intf_thread_t
*
);
static
void
PrevTitle
(
intf_thread_t
*
);
static
void
NextTitle
(
intf_thread_t
*
);
static
void
PrevChapter
(
intf_thread_t
*
);
static
void
NextChapter
(
intf_thread_t
*
);
static
int
HandleKey
(
intf_thread_t
*
,
int
);
static
void
Redraw
(
intf_thread_t
*
,
time_t
*
);
static
int
PrintFullLine
(
const
char
*
p_fmt
,
...
);
static
void
ManageSlider
(
intf_thread_t
*
);
/*****************************************************************************
...
...
@@ -84,35 +76,63 @@ vlc_module_end();
/*****************************************************************************
* intf_sys_t: description and status of ncurses interface
*****************************************************************************/
enum
{
BOX_NONE
,
BOX_HELP
,
BOX_INFO
,
BOX_LOG
,
BOX_PLAYLIST
};
struct
intf_sys_t
{
input_thread_t
*
p_input
;
playlist_t
*
p_playlist
;
input_thread_t
*
p_input
;
float
f_slider
;
float
f_slider_old
;
WINDOW
*
w
;
int
i_box_type
;
int
i_box_y
;
int
i_box_lines
;
int
i_box_lines_total
;
int
i_box_start
;
int
b_box_cleared
;
float
f_slider_state
;
float
f_slider_state_old
;
msg_subscription_t
*
p_sub
;
/* message bank subscription */
};
static
void
DrawBox
(
WINDOW
*
win
,
int
y
,
int
x
,
int
h
,
int
w
,
char
*
title
);
static
void
DrawLine
(
WINDOW
*
win
,
int
y
,
int
x
,
int
w
);
static
void
DrawEmptyLine
(
WINDOW
*
win
,
int
y
,
int
x
,
int
w
);
/*****************************************************************************
* Open: initialize and create window
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
)
{
intf_thread_t
*
p_intf
=
(
intf_thread_t
*
)
p_this
;
intf_sys_t
*
p_sys
;
/* Allocate instance and initialize some members */
p_intf
->
p_sys
=
malloc
(
sizeof
(
intf_sys_t
)
);
if
(
p_intf
->
p_sys
==
NULL
)
{
msg_Err
(
p_intf
,
"out of memory"
);
return
VLC_ENOMEM
;
}
p_intf
->
p_sys
->
p_input
=
NULL
;
p_intf
->
pf_run
=
Run
;
p_sys
=
p_intf
->
p_sys
=
malloc
(
sizeof
(
intf_sys_t
)
);
p_sys
->
p_playlist
=
NULL
;
p_sys
->
p_input
=
NULL
;
p_sys
->
f_slider
=
0
.
0
;
p_sys
->
f_slider_old
=
0
.
0
;
p_sys
->
i_box_type
=
BOX_PLAYLIST
;
p_sys
->
i_box_lines
=
0
;
p_sys
->
i_box_start
=
0
;
p_sys
->
i_box_lines_total
=
0
;
p_sys
->
b_box_cleared
=
VLC_FALSE
;
p_sys
->
p_sub
=
msg_Subscribe
(
p_intf
);
/* Initialize the curses library */
initscr
();
p_sys
->
w
=
initscr
();
keypad
(
p_sys
->
w
,
TRUE
);
/* Don't do NL -> CR/NL */
nonl
();
/* Take input chars one at a time */
...
...
@@ -125,6 +145,9 @@ static int Open( vlc_object_t *p_this )
clear
();
/* exported function */
p_intf
->
pf_run
=
Run
;
return
VLC_SUCCESS
;
}
...
...
@@ -134,17 +157,24 @@ static int Open( vlc_object_t *p_this )
static
void
Close
(
vlc_object_t
*
p_this
)
{
intf_thread_t
*
p_intf
=
(
intf_thread_t
*
)
p_this
;
intf_sys_t
*
p_sys
=
p_intf
->
p_sys
;
if
(
p_intf
->
p_sys
->
p_input
)
if
(
p_sys
->
p_input
)
{
vlc_object_release
(
p_sys
->
p_input
);
}
if
(
p_sys
->
p_playlist
)
{
vlc_object_release
(
p_
intf
->
p_sys
->
p_inpu
t
);
vlc_object_release
(
p_
sys
->
p_playlis
t
);
}
/* Close the ncurses interface */
endwin
();
msg_Unsubscribe
(
p_intf
,
p_sys
->
p_sub
);
/* Destroy structure */
free
(
p_
intf
->
p_
sys
);
free
(
p_sys
);
}
/*****************************************************************************
...
...
@@ -152,7 +182,9 @@ static void Close( vlc_object_t *p_this )
*****************************************************************************/
static
void
Run
(
intf_thread_t
*
p_intf
)
{
signed
char
i_key
;
intf_sys_t
*
p_sys
=
p_intf
->
p_sys
;
int
i_key
;
time_t
t_last_refresh
;
/*
...
...
@@ -165,18 +197,33 @@ static void Run( intf_thread_t *p_intf )
msleep
(
INTF_IDLE_SLEEP
);
/* Update the input */
if
(
p_
intf
->
p_sys
->
p_inpu
t
==
NULL
)
if
(
p_
sys
->
p_playlis
t
==
NULL
)
{
p_intf
->
p_sys
->
p_input
=
vlc_object_find
(
p_intf
,
VLC_OBJECT_INPUT
,
FIND_ANYWHERE
);
p_sys
->
p_playlist
=
vlc_object_find
(
p_intf
,
VLC_OBJECT_PLAYLIST
,
FIND_ANYWHERE
);
}
if
(
p_sys
->
p_input
==
NULL
)
{
if
(
p_sys
->
p_playlist
)
{
p_sys
->
p_input
=
vlc_object_find
(
p_sys
->
p_playlist
,
VLC_OBJECT_INPUT
,
FIND_CHILD
);
}
else
{
p_sys
->
p_input
=
vlc_object_find
(
p_intf
,
VLC_OBJECT_INPUT
,
FIND_ANYWHERE
);
}
p_sys
->
b_box_cleared
=
VLC_FALSE
;
}
else
if
(
p_
intf
->
p_
sys
->
p_input
->
b_dead
)
else
if
(
p_sys
->
p_input
->
b_dead
)
{
vlc_object_release
(
p_intf
->
p_sys
->
p_input
);
p_intf
->
p_sys
->
p_input
=
NULL
;
vlc_object_release
(
p_sys
->
p_input
);
p_sys
->
p_input
=
NULL
;
p_sys
->
f_slider
=
p_sys
->
f_slider_old
=
0
.
0
;
p_sys
->
b_box_cleared
=
VLC_FALSE
;
}
while
(
(
i_key
=
getch
())
!=
-
1
)
while
(
(
i_key
=
getch
())
!=
-
1
)
{
/*
* HandleKey returns 1 if the screen needs to be redrawn
...
...
@@ -186,6 +233,13 @@ static void Run( intf_thread_t *p_intf )
Redraw
(
p_intf
,
&
t_last_refresh
);
}
}
/* Hack */
if
(
p_sys
->
f_slider
>
0
.
0001
&&
!
p_sys
->
b_box_cleared
)
{
clear
();
Redraw
(
p_intf
,
&
t_last_refresh
);
p_sys
->
b_box_cleared
=
VLC_TRUE
;
}
/*
* redraw the screen every second
...
...
@@ -202,31 +256,209 @@ static void Run( intf_thread_t *p_intf )
static
int
HandleKey
(
intf_thread_t
*
p_intf
,
int
i_key
)
{
intf_sys_t
*
p_sys
=
p_intf
->
p_sys
;
vlc_value_t
val
;
if
(
p_sys
->
i_box_type
==
BOX_PLAYLIST
&&
p_sys
->
p_playlist
)
{
switch
(
i_key
)
{
/* Playlist sort */
case
'r'
:
playlist_Sort
(
p_sys
->
p_playlist
,
SORT_RANDOM
,
SORT_NORMAL
);
return
1
;
case
'o'
:
playlist_Sort
(
p_sys
->
p_playlist
,
SORT_TITLE
,
SORT_NORMAL
);
return
1
;
case
'O'
:
playlist_Sort
(
p_sys
->
p_playlist
,
SORT_TITLE
,
SORT_REVERSE
);
return
1
;
/* Playlist navigation */
case
KEY_HOME
:
playlist_Goto
(
p_sys
->
p_playlist
,
0
);
return
1
;
case
KEY_END
:
playlist_Goto
(
p_sys
->
p_playlist
,
p_sys
->
p_playlist
->
i_size
-
1
);
return
1
;
case
KEY_UP
:
playlist_Prev
(
p_sys
->
p_playlist
);
return
1
;
case
KEY_DOWN
:
playlist_Next
(
p_sys
->
p_playlist
);
return
1
;
case
KEY_PPAGE
:
{
int
i_item
=
p_sys
->
p_playlist
->
i_index
-
p_sys
->
i_box_lines
;
if
(
i_item
<
0
)
i_item
=
0
;
playlist_Goto
(
p_sys
->
p_playlist
,
i_item
);
return
1
;
}
case
KEY_NPAGE
:
{
int
i_item
=
p_sys
->
p_playlist
->
i_index
+
p_sys
->
i_box_lines
;
if
(
i_item
>=
p_sys
->
p_playlist
->
i_size
)
i_item
=
p_sys
->
p_playlist
->
i_size
-
1
;
if
(
i_item
>
0
)
{
playlist_Goto
(
p_sys
->
p_playlist
,
i_item
);
}
return
1
;
}
case
KEY_BACKSPACE
:
playlist_Delete
(
p_sys
->
p_playlist
,
p_sys
->
p_playlist
->
i_index
);
return
1
;
case
KEY_DC
:
{
int
i_item
=
p_sys
->
p_playlist
->
i_index
;
playlist_Delete
(
p_sys
->
p_playlist
,
p_sys
->
p_playlist
->
i_index
);
if
(
i_item
<
p_sys
->
p_playlist
->
i_size
)
{
playlist_Goto
(
p_sys
->
p_playlist
,
i_item
);
}
return
1
;
}
default:
break
;
}
}
else
if
(
p_sys
->
i_box_type
==
BOX_HELP
||
p_sys
->
i_box_type
==
BOX_INFO
)
{
switch
(
i_key
)
{
case
KEY_HOME
:
p_sys
->
i_box_start
=
0
;
return
1
;
case
KEY_END
:
p_sys
->
i_box_start
=
p_sys
->
i_box_lines_total
-
1
;
return
1
;
case
KEY_UP
:
if
(
p_sys
->
i_box_start
>
0
)
p_sys
->
i_box_start
--
;
return
1
;
case
KEY_DOWN
:
if
(
p_sys
->
i_box_start
<
p_sys
->
i_box_lines_total
-
1
)
{
p_sys
->
i_box_start
++
;
}
return
1
;
case
KEY_PPAGE
:
p_sys
->
i_box_start
-=
p_sys
->
i_box_lines
;
if
(
p_sys
->
i_box_start
<
0
)
p_sys
->
i_box_start
=
0
;
return
1
;
case
KEY_NPAGE
:
p_sys
->
i_box_start
+=
p_sys
->
i_box_lines
;
if
(
p_sys
->
i_box_start
>=
p_sys
->
i_box_lines_total
)
{
p_sys
->
i_box_start
=
p_sys
->
i_box_lines_total
-
1
;
}
return
1
;
default:
break
;
}
}
else
if
(
p_sys
->
i_box_type
==
BOX_NONE
)
{
switch
(
i_key
)
{
case
KEY_HOME
:
p_sys
->
f_slider
=
0
;
ManageSlider
(
p_intf
);
return
1
;
case
KEY_END
:
p_sys
->
f_slider
=
99
.
9
;
ManageSlider
(
p_intf
);
return
1
;
case
KEY_UP
:
p_sys
->
f_slider
+=
20
.
0
;
if
(
p_sys
->
f_slider
>=
99
.
0
)
p_sys
->
f_slider
=
99
.
0
;
ManageSlider
(
p_intf
);
return
1
;
case
KEY_DOWN
:
p_sys
->
f_slider
-=
20
.
0
;
if
(
p_sys
->
f_slider
<
0
.
0
)
p_sys
->
f_slider
=
0
.
0
;
ManageSlider
(
p_intf
);
return
1
;
default:
break
;
}
}
/* Common keys */
switch
(
i_key
)
{
case
'q'
:
case
'Q'
:
case
0x1b
:
/* Esc */
p_intf
->
b_die
=
1
;
return
0
;
case
'f'
:
FullScreen
(
p_intf
);
/* Box switching */
case
'i'
:
if
(
p_sys
->
i_box_type
==
BOX_INFO
)
p_sys
->
i_box_type
=
BOX_NONE
;
else
p_sys
->
i_box_type
=
BOX_INFO
;
p_sys
->
i_box_lines_total
=
0
;
return
1
;
case
'l'
:
if
(
p_sys
->
i_box_type
==
BOX_LOG
)
p_sys
->
i_box_type
=
BOX_NONE
;
else
p_sys
->
i_box_type
=
BOX_LOG
;
return
1
;
case
'P'
:
if
(
p_sys
->
i_box_type
==
BOX_PLAYLIST
)
p_sys
->
i_box_type
=
BOX_NONE
;
else
p_sys
->
i_box_type
=
BOX_PLAYLIST
;
return
1
;
case
'h'
:
case
'H'
:
if
(
p_sys
->
i_box_type
==
BOX_HELP
)
p_sys
->
i_box_type
=
BOX_NONE
;
else
p_sys
->
i_box_type
=
BOX_HELP
;
p_sys
->
i_box_lines_total
=
0
;
return
1
;
case
'p'
:
Play
(
p_intf
);
/* Navigation */
case
KEY_RIGHT
:
p_sys
->
f_slider
+=
5
.
0
;
if
(
p_sys
->
f_slider
>
99
.
9
)
p_sys
->
f_slider
=
99
.
9
;
ManageSlider
(
p_intf
);
return
1
;
case
' '
:
Pause
(
p_intf
);
case
KEY_LEFT
:
p_sys
->
f_slider
-=
5
.
0
;
if
(
p_sys
->
f_slider
<
0
.
0
)
p_sys
->
f_slider
=
0
.
0
;
ManageSlider
(
p_intf
);
return
1
;
case
's'
:
Stop
(
p_intf
);
/* Common control */
case
'f'
:
{
vout_thread_t
*
p_vout
;
p_vout
=
vlc_object_find
(
p_intf
->
p_sys
->
p_input
,
VLC_OBJECT_VOUT
,
FIND_CHILD
);
if
(
p_vout
)
{
p_vout
->
i_changes
|=
VOUT_FULLSCREEN_CHANGE
;
vlc_object_release
(
p_vout
);
}
return
0
;
}
case
' '
:
PlayPause
(
p_intf
);
return
1
;
case
'n'
:
Next
(
p_intf
);
case
's'
:
if
(
p_intf
->
p_sys
->
p_playlist
)
{
playlist_Stop
(
p_intf
->
p_sys
->
p_playlist
);
}
return
1
;
case
'e'
:
...
...
@@ -234,30 +466,51 @@ static int HandleKey( intf_thread_t *p_intf, int i_key )
return
1
;
case
'['
:
PrevTitle
(
p_intf
);
if
(
p_sys
->
p_input
)
{
val
.
b_bool
=
VLC_TRUE
;
var_Set
(
p_sys
->
p_input
,
"prev-title"
,
val
);
}
break
;
case
']'
:
NextTitle
(
p_intf
);
if
(
p_sys
->
p_input
)
{
val
.
b_bool
=
VLC_TRUE
;
var_Set
(
p_sys
->
p_input
,
"next-title"
,
val
);
}
break
;
case
'<'
:
PrevChapter
(
p_intf
);
if
(
p_sys
->
p_input
)
{
val
.
b_bool
=
VLC_TRUE
;
var_Set
(
p_sys
->
p_input
,
"prev-chapter"
,
val
);
}
break
;
case
'>'
:
NextChapter
(
p_intf
);
break
;
case
KEY_RIGHT
:
p_intf
->
p_sys
->
f_slider_state
+=
100
;
ManageSlider
(
p_intf
);
if
(
p_sys
->
p_input
)
{
val
.
b_bool
=
VLC_TRUE
;
var_Set
(
p_sys
->
p_input
,
"next-chapter"
,
val
);
}
break
;
case
KEY_LEFT
:
p_intf
->
p_sys
->
f_slider_state
--
;
ManageSlider
(
p_intf
);
break
;
case
'p'
:
if
(
p_intf
->
p_sys
->
p_playlist
)
{
playlist_Prev
(
p_intf
->
p_sys
->
p_playlist
);
}
clear
();
return
1
;
case
'n'
:
if
(
p_intf
->
p_sys
->
p_playlist
)
{
playlist_Next
(
p_intf
->
p_sys
->
p_playlist
);
}
clear
();
return
1
;
/*
* ^l should clear and redraw the screen
...
...
@@ -267,17 +520,46 @@ static int HandleKey( intf_thread_t *p_intf, int i_key )
return
1
;
default:
break
;
return
0
;
}
}
static
void
ManageSlider
(
intf_thread_t
*
p_intf
)
{
intf_sys_t
*
p_sys
=
p_intf
->
p_sys
;
input_thread_t
*
p_input
=
p_sys
->
p_input
;
vlc_value_t
val
;
if
(
p_input
==
NULL
)
{
return
;
}
var_Get
(
p_input
,
"state"
,
&
val
);
if
(
val
.
i_int
!=
PLAYING_S
)
{
return
;
}
var_Get
(
p_input
,
"position"
,
&
val
);
if
(
p_sys
->
f_slider
==
p_sys
->
f_slider_old
)
{
p_sys
->
f_slider
=
p_sys
->
f_slider_old
=
100
*
val
.
f_float
;
}
else
{
p_sys
->
f_slider_old
=
p_sys
->
f_slider
;
return
0
;
val
.
f_float
=
p_sys
->
f_slider
/
100
.
0
;
var_Set
(
p_input
,
"position"
,
val
);
}
}
static
int
PrintFullLine
(
const
char
*
p_fmt
,
...
)
static
void
mvnprintw
(
int
y
,
int
x
,
int
w
,
const
char
*
p_fmt
,
...
)
{
va_list
vl_args
;
char
*
p_buf
=
NULL
;
int
i_len
;
char
*
p_buf
=
NULL
;
int
i_len
;
va_start
(
vl_args
,
p_fmt
);
vasprintf
(
&
p_buf
,
p_fmt
,
vl_args
);
...
...
@@ -285,89 +567,373 @@ static int PrintFullLine ( const char *p_fmt, ... )
if
(
p_buf
==
NULL
)
{
return
-
1
;
return
;
}
if
(
w
>
0
)
{
if
(
(
i_len
=
strlen
(
p_buf
)
)
>
w
)
{
int
i_cut
=
i_len
-
w
;
int
x1
=
i_len
/
2
-
i_cut
/
2
;
int
x2
=
x1
+
i_cut
;
i_len
=
strlen
(
p_buf
);
if
(
i_len
>
x2
)
{
memmove
(
&
p_buf
[
x1
],
&
p_buf
[
x2
],
i_len
-
x2
);
}
p_buf
[
w
]
=
'\0'
;
if
(
w
>
7
)
{
p_buf
[
w
/
2
-
1
]
=
'.'
;
p_buf
[
w
/
2
]
=
'.'
;
p_buf
[
w
/
2
+
1
]
=
'.'
;
}
mvprintw
(
y
,
x
,
"%s"
,
p_buf
);
}
else
{
mvprintw
(
y
,
x
,
"%s"
,
p_buf
);
mvhline
(
y
,
x
+
i_len
,
' '
,
w
-
i_len
);
}
}
}
static
void
MainBoxWrite
(
intf_thread_t
*
p_intf
,
int
l
,
int
x
,
const
char
*
p_fmt
,
...
)
{
intf_sys_t
*
p_sys
=
p_intf
->
p_sys
;
/*
* make sure we don't exceed the border on the right side
*/
if
(
i_len
>
COLS
)
va_list
vl_args
;
char
*
p_buf
=
NULL
;
if
(
l
<
p_sys
->
i_box_start
||
l
-
p_sys
->
i_box_start
>=
p_sys
->
i_box_lines
)
{
p_buf
[
COLS
]
=
'\0'
;
i_len
=
COLS
;
printw
(
"%s"
,
p_buf
);
return
;
}
else
va_start
(
vl_args
,
p_fmt
);
vasprintf
(
&
p_buf
,
p_fmt
,
vl_args
);
va_end
(
vl_args
);
if
(
p_buf
==
NULL
)
{
printw
(
"%s"
,
p_buf
);
hline
(
' '
,
COLS
-
i_len
);
return
;
}
free
(
p_buf
);
return
i_len
;
mvnprintw
(
p_sys
->
i_box_y
+
l
-
p_sys
->
i_box_start
,
x
,
COLS
-
x
-
1
,
"%s"
,
p_buf
);
}
static
void
Redraw
(
intf_thread_t
*
p_intf
,
time_t
*
t_last_refresh
)
static
void
Redraw
(
intf_thread_t
*
p_intf
,
time_t
*
t_last_refresh
)
{
int
row
=
0
;
intf_sys_t
*
p_sys
=
p_intf
->
p_sys
;
input_thread_t
*
p_input
=
p_sys
->
p_input
;
int
y
=
0
;
int
h
;
int
y_end
;
move
(
row
,
0
);
//clear(
);
/* Title */
attrset
(
A_REVERSE
);
PrintFullLine
(
VOUT_TITLE
" (ncurses interface)
"
);
mvnprintw
(
y
,
0
,
COLS
,
VOUT_TITLE
" (ncurses interface) [ h for help ]
"
);
attroff
(
A_REVERSE
);
y
+=
2
;
row
++
;
/* Infos */
if
(
p_input
&&
!
p_input
->
b_dead
)
{
char
buf1
[
MSTRTIME_MAX_SIZE
];
char
buf2
[
MSTRTIME_MAX_SIZE
];
vlc_value_t
val
;
vlc_value_t
val_list
;
row
++
;
move
(
row
,
0
);
/* Source */
mvnprintw
(
y
++
,
0
,
COLS
,
" Source : %s"
,
p_input
->
psz_source
);
if
(
p_intf
->
p_sys
->
p_input
!=
NULL
)
/* State */
var_Get
(
p_input
,
"state"
,
&
val
);
if
(
val
.
i_int
==
PLAYING_S
)
{
mvnprintw
(
y
++
,
0
,
COLS
,
" State : Playing"
);
}
else
if
(
val
.
i_int
==
PAUSE_S
)
{
mvnprintw
(
y
++
,
0
,
COLS
,
" State : Paused"
);
}
else
{
y
++
;
}
if
(
val
.
i_int
!=
INIT_S
&&
val
.
i_int
!=
END_S
)
{
/* Position */
var_Get
(
p_input
,
"time"
,
&
val
);
msecstotimestr
(
buf1
,
val
.
i_time
/
1000
);
var_Get
(
p_input
,
"length"
,
&
val
);
msecstotimestr
(
buf2
,
val
.
i_time
/
1000
);
mvnprintw
(
y
++
,
0
,
COLS
,
" Position : %s/%s (%.2f%%)"
,
buf1
,
buf2
,
p_sys
->
f_slider
);
/* Title */
if
(
!
var_Get
(
p_input
,
"title"
,
&
val
)
)
{
var_Change
(
p_input
,
"title"
,
VLC_VAR_GETCHOICES
,
&
val_list
,
NULL
);
if
(
val_list
.
p_list
->
i_count
>
0
)
{
mvnprintw
(
y
++
,
0
,
COLS
,
" Title : %d/%d"
,
val
.
i_int
,
val_list
.
p_list
->
i_count
);
}
var_Change
(
p_input
,
"title"
,
VLC_VAR_FREELIST
,
&
val_list
,
NULL
);
}
/* Chapter */
if
(
!
var_Get
(
p_input
,
"chapter"
,
&
val
)
)
{
var_Change
(
p_input
,
"chapter"
,
VLC_VAR_GETCHOICES
,
&
val_list
,
NULL
);
if
(
val_list
.
p_list
->
i_count
>
0
)
{
mvnprintw
(
y
++
,
0
,
COLS
,
" Chapter : %d/%d"
,
val
.
i_int
,
val_list
.
p_list
->
i_count
);
}
var_Change
(
p_input
,
"chapter"
,
VLC_VAR_FREELIST
,
&
val_list
,
NULL
);
}
}
else
{
y
++
;
}
}
else
{
PrintFullLine
(
" DVD Chapter:%3d DVD Title:%3d"
,
p_intf
->
p_sys
->
p_input
->
stream
.
p_selected_area
->
i_part
,
p_intf
->
p_sys
->
p_input
->
stream
.
p_selected_area
->
i_id
);
mvnprintw
(
y
++
,
0
,
COLS
,
"Source: <no current item>"
);
DrawEmptyLine
(
p_sys
->
w
,
y
++
,
0
,
COLS
);
DrawEmptyLine
(
p_sys
->
w
,
y
++
,
0
,
COLS
);
}
row
++
;
mvaddch
(
row
,
0
,
ACS_ULCORNER
);
mvhline
(
row
,
1
,
ACS_HLINE
,
COLS
-
2
);
mvaddch
(
row
,
COLS
-
1
,
ACS_URCORNER
)
;
DrawBox
(
p_sys
->
w
,
y
,
0
,
3
,
COLS
,
""
)
;
DrawEmptyLine
(
p_sys
->
w
,
y
+
1
,
1
,
COLS
-
2
);
DrawLine
(
p_sys
->
w
,
y
+
1
,
1
,
(
int
)(
p_intf
->
p_sys
->
f_slider
/
100
.
0
*
(
COLS
-
2
))
);
y
+=
3
;
row
++
;
mvaddch
(
row
,
0
,
ACS_VLINE
);
attrset
(
A_REVERSE
);
mvhline
(
row
,
1
,
' '
,
(
(
int
)
p_intf
->
p_sys
->
f_slider_state
%
COLS
-
2
)
);
attroff
(
A_REVERSE
);
mvaddch
(
row
,
COLS
-
1
,
ACS_VLINE
);
p_sys
->
i_box_y
=
y
+
1
;
p_sys
->
i_box_lines
=
LINES
-
y
-
2
;
row
++
;
mvaddch
(
row
,
0
,
ACS_LLCORNER
);
mvhline
(
row
,
1
,
ACS_HLINE
,
COLS
-
2
);
mvaddch
(
row
,
COLS
-
1
,
ACS_LRCORNER
);
h
=
LINES
-
y
;
y_end
=
y
+
h
-
1
;
refresh
();
if
(
p_sys
->
i_box_type
==
BOX_HELP
)
{
/* Help box */
int
l
=
0
;
DrawBox
(
p_sys
->
w
,
y
++
,
0
,
h
,
COLS
,
" Help "
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
"[Display]"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" h,H Show/Hide help box"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" i Show/Hide informations box"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" l Show/Hide logs box"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" P Show/Hide playlist box"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
""
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
"[Global]"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" q, Q Quit"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" s Stop"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" <space> Pause/Play"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" n, p Next/Previous item"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" [, ] Next/Previous title"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" <, > Next/Previous title"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" <right> Seek +5%%"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" <left> Seek -5%%"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
""
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
"[Playlist]"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" r Randomize playlist"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" o Order Playlist"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" O Reverse order Playlist"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" <del> Delete an entry"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" <backspace> Delete an entry"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
""
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
"[Boxes]"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" <up>,<down> Navigate through the box line by line"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" <pgup>,<pgdown> Navigate through the box page by page"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
""
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
"[Player]"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" <up>,<down> Seek +/-20%%"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
""
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
"[Miscellaneous]"
);
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" Ctrl-L Refresh the screen"
);
p_sys
->
i_box_lines_total
=
l
;
if
(
p_sys
->
i_box_start
>=
p_sys
->
i_box_lines_total
)
{
p_sys
->
i_box_start
=
p_sys
->
i_box_lines_total
-
1
;
}
*
t_last_refresh
=
time
(
0
);
}
if
(
l
-
p_sys
->
i_box_start
<
p_sys
->
i_box_lines
)
{
y
+=
l
-
p_sys
->
i_box_start
;
}
else
{
y
+=
p_sys
->
i_box_lines
;
}
}
else
if
(
p_sys
->
i_box_type
==
BOX_INFO
)
{
/* Info box */
int
l
=
0
;
DrawBox
(
p_sys
->
w
,
y
++
,
0
,
h
,
COLS
,
" Informations "
);
static
void
FullScreen
(
intf_thread_t
*
p_intf
)
{
vout_thread_t
*
p_vout
;
if
(
p_input
)
{
input_info_category_t
*
p_category
;
input_info_t
*
p_info
;
vlc_mutex_lock
(
&
p_input
->
stream
.
stream_lock
);
p_category
=
p_input
->
stream
.
p_info
;
while
(
p_category
)
{
if
(
y
>=
y_end
)
break
;
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" [%s]"
,
p_category
->
psz_name
);
p_info
=
p_category
->
p_info
;
while
(
p_info
)
{
if
(
y
>=
y_end
)
break
;
MainBoxWrite
(
p_intf
,
l
++
,
1
,
" %s: %s"
,
p_info
->
psz_name
,
p_info
->
psz_value
);
p_info
=
p_info
->
p_next
;
}
p_category
=
p_category
->
p_next
;
}
vlc_mutex_unlock
(
&
p_input
->
stream
.
stream_lock
);
}
else
{
MainBoxWrite
(
p_intf
,
l
++
,
1
,
"No item currently playing"
);
}
p_sys
->
i_box_lines_total
=
l
;
if
(
p_sys
->
i_box_start
>=
p_sys
->
i_box_lines_total
)
{
p_sys
->
i_box_start
=
p_sys
->
i_box_lines_total
-
1
;
}
if
(
l
-
p_sys
->
i_box_start
<
p_sys
->
i_box_lines
)
{
y
+=
l
-
p_sys
->
i_box_start
;
}
else
{
y
+=
p_sys
->
i_box_lines
;
}
}
else
if
(
p_sys
->
i_box_type
==
BOX_LOG
)
{
int
i_line
=
0
;
int
i_stop
;
int
i_start
;
DrawBox
(
p_sys
->
w
,
y
++
,
0
,
h
,
COLS
,
" Logs "
);
i_start
=
p_intf
->
p_sys
->
p_sub
->
i_start
;
p_vout
=
vlc_object_find
(
p_intf
->
p_sys
->
p_input
,
VLC_OBJECT_VOUT
,
FIND_CHILD
);
if
(
p_vout
==
NULL
)
vlc_mutex_lock
(
p_intf
->
p_sys
->
p_sub
->
p_lock
);
i_stop
=
*
p_intf
->
p_sys
->
p_sub
->
pi_stop
;
vlc_mutex_unlock
(
p_intf
->
p_sys
->
p_sub
->
p_lock
);
for
(
;;
)
{
static
const
char
*
ppsz_type
[
4
]
=
{
""
,
"error"
,
"warning"
,
"debug"
};
if
(
i_line
>=
h
-
2
)
{
break
;
}
i_stop
--
;
i_line
++
;
if
(
i_stop
<
0
)
i_stop
+=
VLC_MSG_QSIZE
;
if
(
i_stop
==
i_start
)
{
break
;
}
mvnprintw
(
y
+
h
-
2
-
i_line
,
1
,
COLS
-
2
,
" [%s] %s"
,
ppsz_type
[
p_sys
->
p_sub
->
p_msg
[
i_stop
].
i_type
],
p_sys
->
p_sub
->
p_msg
[
i_stop
].
psz_msg
);
}
vlc_mutex_lock
(
p_intf
->
p_sys
->
p_sub
->
p_lock
);
p_intf
->
p_sys
->
p_sub
->
i_start
=
i_stop
;
vlc_mutex_unlock
(
p_intf
->
p_sys
->
p_sub
->
p_lock
);
y
=
y_end
;
}
else
if
(
p_sys
->
i_box_type
==
BOX_PLAYLIST
&&
p_sys
->
p_playlist
)
{
return
;
/* Playlist box */
playlist_t
*
p_playlist
=
p_sys
->
p_playlist
;
int
i_start
,
i_stop
;
int
i_item
;
DrawBox
(
p_sys
->
w
,
y
++
,
0
,
h
,
COLS
,
" Playlist "
);
if
(
p_playlist
->
i_index
<
(
h
-
2
)
/
2
)
{
i_start
=
0
;
i_stop
=
h
-
2
;
}
else
if
(
p_playlist
->
i_size
-
p_playlist
->
i_index
>
(
h
-
2
)
/
2
)
{
i_start
=
p_playlist
->
i_index
-
(
h
-
2
)
/
2
;
i_stop
=
i_start
+
h
-
2
;
}
else
{
i_stop
=
p_playlist
->
i_size
;
i_start
=
p_playlist
->
i_size
-
(
h
-
2
);
}
if
(
i_start
<
0
)
{
i_start
=
0
;
}
if
(
i_stop
>
p_playlist
->
i_size
)
{
i_stop
=
p_playlist
->
i_size
;
}
for
(
i_item
=
i_start
;
i_item
<
i_stop
;
i_item
++
)
{
vlc_bool_t
b_selected
=
(
p_playlist
->
i_index
==
i_item
);
if
(
y
>=
y_end
)
break
;
if
(
b_selected
)
{
attrset
(
A_REVERSE
);
}
if
(
!
strcmp
(
p_playlist
->
pp_items
[
i_item
]
->
psz_name
,
p_playlist
->
pp_items
[
i_item
]
->
psz_uri
)
)
{
mvnprintw
(
y
++
,
1
,
COLS
-
2
,
" %d - '%s'"
,
i_item
,
p_playlist
->
pp_items
[
i_item
]
->
psz_uri
);
}
else
{
mvnprintw
(
y
++
,
1
,
COLS
-
2
,
" %d - '%s' (%s)"
,
i_item
,
p_playlist
->
pp_items
[
i_item
]
->
psz_uri
,
p_playlist
->
pp_items
[
i_item
]
->
psz_name
);
}
if
(
b_selected
)
{
attroff
(
A_REVERSE
);
}
}
}
else
{
y
++
;
}
p_vout
->
i_changes
|=
VOUT_FULLSCREEN_CHANGE
;
vlc_object_release
(
p_vout
);
while
(
y
<
y_end
)
{
DrawEmptyLine
(
p_sys
->
w
,
y
++
,
1
,
COLS
-
2
);
}
refresh
();
*
t_last_refresh
=
time
(
0
);
}
static
void
Eject
(
intf_thread_t
*
p_intf
)
...
...
@@ -480,193 +1046,77 @@ static void Eject ( intf_thread_t *p_intf )
return
;
}
static
void
Play
(
intf_thread_t
*
p_intf
)
static
void
Play
Pause
(
intf_thread_t
*
p_intf
)
{
playlist_t
*
p_playlist
=
vlc_object_find
(
p_intf
,
VLC_OBJECT_PLAYLIST
,
FIND_ANYWHERE
);
if
(
p_playlist
)
{
vlc_mutex_lock
(
&
p_playlist
->
object_lock
);
input_thread_t
*
p_input
=
p_intf
->
p_sys
->
p_input
;
vlc_value_t
val
;
if
(
p_playlist
->
i_size
)
if
(
p_input
)
{
var_Get
(
p_input
,
"state"
,
&
val
);
if
(
val
.
i_int
!=
PAUSE_S
)
{
vlc_mutex_unlock
(
&
p_playlist
->
object_lock
);
playlist_Play
(
p_playlist
);
vlc_object_release
(
p_playlist
);
val
.
i_int
=
PAUSE_S
;
}
else
{
vlc_mutex_unlock
(
&
p_playlist
->
object_lock
);
vlc_object_release
(
p_playlist
);
val
.
i_int
=
PLAYING_S
;
}
var_Set
(
p_input
,
"state"
,
val
);
}
}
static
void
Pause
(
intf_thread_t
*
p_intf
)
{
if
(
p_intf
->
p_sys
->
p_input
==
NULL
)
else
if
(
p_intf
->
p_sys
->
p_playlist
)
{
return
;
}
input_SetStatus
(
p_intf
->
p_sys
->
p_input
,
INPUT_STATUS_PAUSE
);
return
;
}
static
void
Stop
(
intf_thread_t
*
p_intf
)
{
playlist_t
*
p_playlist
=
vlc_object_find
(
p_intf
,
VLC_OBJECT_PLAYLIST
,
FIND_ANYWHERE
);
if
(
p_playlist
==
NULL
)
{
return
;
playlist_Play
(
p_intf
->
p_sys
->
p_playlist
);
}
playlist_Stop
(
p_playlist
);
vlc_object_release
(
p_playlist
);
return
;
}
static
void
Next
(
intf_thread_t
*
p_intf
)
/****************************************************************************
*
****************************************************************************/
static
void
DrawBox
(
WINDOW
*
win
,
int
y
,
int
x
,
int
h
,
int
w
,
char
*
title
)
{
in
put_area_t
*
p_area
;
int
i_
id
;
in
t
i
;
int
i_
len
;
vlc_mutex_lock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
i_id
=
p_intf
->
p_sys
->
p_input
->
stream
.
p_selected_area
->
i_id
+
1
;
if
(
i_id
<
p_intf
->
p_sys
->
p_input
->
stream
.
i_area_nb
)
if
(
w
>
3
&&
h
>
2
)
{
p_area
=
p_intf
->
p_sys
->
p_input
->
stream
.
pp_areas
[
i_id
];
vlc_mutex_unlock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
input_ChangeArea
(
p_intf
->
p_sys
->
p_input
,
p_area
);
input_SetStatus
(
p_intf
->
p_sys
->
p_input
,
INPUT_STATUS_PLAY
);
}
if
(
title
==
NULL
)
title
=
""
;
i_len
=
strlen
(
title
);
vlc_mutex_unlock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
}
if
(
i_len
>
w
-
2
)
i_len
=
w
-
2
;
static
void
ManageSlider
(
intf_thread_t
*
p_intf
)
{
if
(
p_intf
->
p_sys
->
p_input
!=
NULL
)
{
vlc_mutex_lock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
mvwaddch
(
win
,
y
,
x
,
ACS_ULCORNER
);
mvwhline
(
win
,
y
,
x
+
1
,
ACS_HLINE
,
(
w
-
i_len
-
2
)
/
2
);
mvwprintw
(
win
,
y
,
x
+
1
+
(
w
-
i_len
-
2
)
/
2
,
"%s"
,
title
);
mvwhline
(
win
,
y
,
x
+
(
w
-
i_len
)
/
2
+
i_len
,
ACS_HLINE
,
w
-
1
-
((
w
-
i_len
)
/
2
+
i_len
)
);
mvwaddch
(
win
,
y
,
x
+
w
-
1
,
ACS_URCORNER
);
if
(
p_intf
->
p_sys
->
p_input
->
stream
.
b_seekable
&&
p_intf
->
p_sys
->
p_input
->
stream
.
control
.
i_status
==
PLAYING_S
)
for
(
i
=
0
;
i
<
h
-
2
;
i
++
)
{
float
newvalue
=
p_intf
->
p_sys
->
f_slider_state
;
#define p_area p_intf->p_sys->p_input->stream.p_selected_area
/* If the user hasn't touched the slider since the last time,
* then the input can safely change it */
if
(
newvalue
==
p_intf
->
p_sys
->
f_slider_state_old
)
{
/* Update the value */
p_intf
->
p_sys
->
f_slider_state
=
p_intf
->
p_sys
->
f_slider_state_old
=
(
100
*
p_area
->
i_tell
)
/
p_area
->
i_size
;
}
/* Otherwise, send message to the input if the user has
* finished dragging the slider */
else
{
off_t
i_seek
=
(
newvalue
*
p_area
->
i_size
)
/
100
;
/* release the lock to be able to seek */
vlc_mutex_unlock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
input_Seek
(
p_intf
,
i_seek
,
INPUT_SEEK_SET
);
vlc_mutex_lock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
/* Update the old value */
p_intf
->
p_sys
->
f_slider_state_old
=
newvalue
;
}
# undef p_area
mvwaddch
(
win
,
y
+
i
+
1
,
x
,
ACS_VLINE
);
mvwaddch
(
win
,
y
+
i
+
1
,
x
+
w
-
1
,
ACS_VLINE
);
}
vlc_mutex_unlock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
mvwaddch
(
win
,
y
+
h
-
1
,
x
,
ACS_LLCORNER
);
mvwhline
(
win
,
y
+
h
-
1
,
x
+
1
,
ACS_HLINE
,
w
-
2
);
mvwaddch
(
win
,
y
+
h
-
1
,
x
+
w
-
1
,
ACS_LRCORNER
);
}
}
static
void
PrevTitle
(
intf_thread_t
*
p_intf
)
static
void
DrawEmptyLine
(
WINDOW
*
win
,
int
y
,
int
x
,
int
w
)
{
input_area_t
*
p_area
;
int
i_id
;
vlc_mutex_lock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
i_id
=
p_intf
->
p_sys
->
p_input
->
stream
.
p_selected_area
->
i_id
-
1
;
if
(
i_id
>
0
)
if
(
w
>
0
)
{
p_area
=
p_intf
->
p_sys
->
p_input
->
stream
.
pp_areas
[
i_id
];
vlc_mutex_unlock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
input_ChangeArea
(
p_intf
->
p_sys
->
p_input
,
p_area
);
input_SetStatus
(
p_intf
->
p_sys
->
p_input
,
INPUT_STATUS_PLAY
);
mvhline
(
y
,
x
,
' '
,
w
);
}
vlc_mutex_unlock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
}
static
void
NextTitle
(
intf_thread_t
*
p_intf
)
static
void
DrawLine
(
WINDOW
*
win
,
int
y
,
int
x
,
int
w
)
{
input_area_t
*
p_area
;
int
i_id
;
vlc_mutex_lock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
i_id
=
p_intf
->
p_sys
->
p_input
->
stream
.
p_selected_area
->
i_id
+
1
;
if
(
i_id
<
p_intf
->
p_sys
->
p_input
->
stream
.
i_area_nb
)
if
(
w
>
0
)
{
p_area
=
p_intf
->
p_sys
->
p_input
->
stream
.
pp_areas
[
i_id
];
vlc_mutex_unlock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
input_ChangeArea
(
p_intf
->
p_sys
->
p_input
,
p_area
);
input_SetStatus
(
p_intf
->
p_sys
->
p_input
,
INPUT_STATUS_PLAY
);
attrset
(
A_REVERSE
);
mvhline
(
y
,
x
,
' '
,
w
);
attroff
(
A_REVERSE
);
}
vlc_mutex_unlock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
}
static
void
PrevChapter
(
intf_thread_t
*
p_intf
)
{
input_area_t
*
p_area
;
vlc_mutex_lock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
p_area
=
p_intf
->
p_sys
->
p_input
->
stream
.
p_selected_area
;
if
(
p_area
->
i_part
>
0
)
{
p_area
->
i_part
--
;
vlc_mutex_unlock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
input_ChangeArea
(
p_intf
->
p_sys
->
p_input
,
p_area
);
input_SetStatus
(
p_intf
->
p_sys
->
p_input
,
INPUT_STATUS_PLAY
);
}
vlc_mutex_unlock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
}
static
void
NextChapter
(
intf_thread_t
*
p_intf
)
{
input_area_t
*
p_area
;
vlc_mutex_lock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
p_area
=
p_intf
->
p_sys
->
p_input
->
stream
.
p_selected_area
;
if
(
p_area
->
i_part
<
p_area
->
i_part_nb
)
{
p_area
->
i_part
++
;
vlc_mutex_unlock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
input_ChangeArea
(
p_intf
->
p_sys
->
p_input
,
p_area
);
input_SetStatus
(
p_intf
->
p_sys
->
p_input
,
INPUT_STATUS_PLAY
);
}
vlc_mutex_unlock
(
&
p_intf
->
p_sys
->
p_input
->
stream
.
stream_lock
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment