Mercurial > libdvdnav.hg
annotate navigation.c @ 411:ce9b314b6e43 src
If there is no VMGI or PGCI return instead of try to get them
If there is no menu there isn't much point in trying to jump to them.
author | erik |
---|---|
date | Fri, 30 Jul 2010 23:34:24 +0000 |
parents | 9b8bfc56a7fe |
children | 264c5b900bfb |
rev | line source |
---|---|
388 | 1 /* |
0 | 2 * Copyright (C) 2000 Rich Wareham <richwareham@users.sourceforge.net> |
388 | 3 * |
0 | 4 * This file is part of libdvdnav, a DVD navigation library. |
388 | 5 * |
0 | 6 * libdvdnav is free software; you can redistribute it and/or modify |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
388 | 10 * |
0 | 11 * libdvdnav is distributed in the hope that it will be useful, |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
388 | 15 * |
389
d3c273ced49c
Use consistent license headers everywhere: Fix wrong FSF address.
diego
parents:
388
diff
changeset
|
16 * You should have received a copy of the GNU General Public License along |
d3c273ced49c
Use consistent license headers everywhere: Fix wrong FSF address.
diego
parents:
388
diff
changeset
|
17 * with libdvdnav; if not, write to the Free Software Foundation, Inc., |
d3c273ced49c
Use consistent license headers everywhere: Fix wrong FSF address.
diego
parents:
388
diff
changeset
|
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
0 | 19 */ |
20 | |
21 #ifdef HAVE_CONFIG_H | |
22 #include "config.h" | |
23 #endif | |
24 | |
278 | 25 #include <inttypes.h> |
294
2146ff691bcd
include limits.h; it was included in the previous dvdnav_internal.h and without it players segfault
nicodvb
parents:
290
diff
changeset
|
26 #include <limits.h> |
288
ce4230602517
moved away from dvdnav_internal.h inclusion of various system headers
nicodvb
parents:
285
diff
changeset
|
27 #include <string.h> |
290 | 28 #include <sys/time.h> |
395
9c5aef10d165
Move dvd_types.h, dvdnav_events.h and dvdnav.h into a dvdnav directory.
reimar
parents:
392
diff
changeset
|
29 #include "dvdnav/dvdnav.h" |
386 | 30 #include <dvdread/nav_types.h> |
31 #include <dvdread/ifo_types.h> | |
285
52877d182e96
moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents:
278
diff
changeset
|
32 #include "remap.h" |
52877d182e96
moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents:
278
diff
changeset
|
33 #include "vm/decoder.h" |
52877d182e96
moved all header inclusions from .h to .c files; my word, I've never seen such a horrible entanglement as in this mess
nicodvb
parents:
278
diff
changeset
|
34 #include "vm/vm.h" |
0 | 35 #include "dvdnav_internal.h" |
36 | |
37 /* Navigation API calls */ | |
38 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
5
diff
changeset
|
39 dvdnav_status_t dvdnav_still_skip(dvdnav_t *this) { |
387 | 40 pthread_mutex_lock(&this->vm_lock); |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
5
diff
changeset
|
41 this->position_current.still = 0; |
387 | 42 pthread_mutex_unlock(&this->vm_lock); |
23 | 43 this->skip_still = 1; |
116 | 44 this->sync_wait = 0; |
45 this->sync_wait_skip = 1; | |
46 | |
193 | 47 return DVDNAV_STATUS_OK; |
116 | 48 } |
49 | |
50 dvdnav_status_t dvdnav_wait_skip(dvdnav_t *this) { | |
51 this->sync_wait = 0; | |
52 this->sync_wait_skip = 1; | |
0 | 53 |
193 | 54 return DVDNAV_STATUS_OK; |
0 | 55 } |
56 | |
195 | 57 dvdnav_status_t dvdnav_get_number_of_titles(dvdnav_t *this, int32_t *titles) { |
248
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
58 if (!this->vm->vmgi) { |
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
59 printerr("Bad VM state."); |
223
2d79ef3f3956
we should not start the VM on dvdnav_get_number_of_titles,
mroi
parents:
195
diff
changeset
|
60 return DVDNAV_STATUS_ERR; |
94
e29110f67f3a
Get xine dvd:///dev/dvd:1.2 i.e. title play working again.
jcdutton
parents:
90
diff
changeset
|
61 } |
e29110f67f3a
Get xine dvd:///dev/dvd:1.2 i.e. title play working again.
jcdutton
parents:
90
diff
changeset
|
62 |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
5
diff
changeset
|
63 (*titles) = vm_get_vmgi(this->vm)->tt_srpt->nr_of_srpts; |
0 | 64 |
193 | 65 return DVDNAV_STATUS_OK; |
0 | 66 } |
67 | |
195 | 68 dvdnav_status_t dvdnav_get_number_of_parts(dvdnav_t *this, int32_t title, int32_t *parts) { |
248
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
69 if (!this->vm->vmgi) { |
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
70 printerr("Bad VM state."); |
193 | 71 return DVDNAV_STATUS_ERR; |
95 | 72 } |
73 if ((title < 1) || (title > vm_get_vmgi(this->vm)->tt_srpt->nr_of_srpts) ) { | |
114 | 74 printerr("Passed a title number out of range."); |
193 | 75 return DVDNAV_STATUS_ERR; |
95 | 76 } |
114 | 77 |
95 | 78 (*parts) = vm_get_vmgi(this->vm)->tt_srpt->title[title-1].nr_of_ptts; |
114 | 79 |
193 | 80 return DVDNAV_STATUS_OK; |
5
c1b55dc1bfed
Add API call to get number of programmes in current title.
richwareham
parents:
0
diff
changeset
|
81 } |
c1b55dc1bfed
Add API call to get number of programmes in current title.
richwareham
parents:
0
diff
changeset
|
82 |
195 | 83 dvdnav_status_t dvdnav_current_title_info(dvdnav_t *this, int32_t *title, int32_t *part) { |
84 int32_t retval; | |
388 | 85 |
114 | 86 pthread_mutex_lock(&this->vm_lock); |
87 if (!this->vm->vtsi || !this->vm->vmgi) { | |
88 printerr("Bad VM state."); | |
89 pthread_mutex_unlock(&this->vm_lock); | |
193 | 90 return DVDNAV_STATUS_ERR; |
90 | 91 } |
248
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
92 if (!this->started) { |
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
93 printerr("Virtual DVD machine not started."); |
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
94 pthread_mutex_unlock(&this->vm_lock); |
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
95 return DVDNAV_STATUS_ERR; |
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
96 } |
114 | 97 if (!this->vm->state.pgc) { |
98 printerr("No current PGC."); | |
99 pthread_mutex_unlock(&this->vm_lock); | |
193 | 100 return DVDNAV_STATUS_ERR; |
114 | 101 } |
158 | 102 if ( (this->vm->state.domain == VTSM_DOMAIN) |
103 || (this->vm->state.domain == VMGM_DOMAIN) ) { | |
104 /* Get current Menu ID: into *part. */ | |
344
fb2fbd4cfbf6
in get_PGCIT() check the validity of vm->vtsi before risking to dereference NULL;
nicodvb
parents:
332
diff
changeset
|
105 if(! vm_get_current_menu(this->vm, part)) { |
fb2fbd4cfbf6
in get_PGCIT() check the validity of vm->vtsi before risking to dereference NULL;
nicodvb
parents:
332
diff
changeset
|
106 pthread_mutex_unlock(&this->vm_lock); |
fb2fbd4cfbf6
in get_PGCIT() check the validity of vm->vtsi before risking to dereference NULL;
nicodvb
parents:
332
diff
changeset
|
107 return DVDNAV_STATUS_ERR; |
fb2fbd4cfbf6
in get_PGCIT() check the validity of vm->vtsi before risking to dereference NULL;
nicodvb
parents:
332
diff
changeset
|
108 } |
159 | 109 if (*part > -1) { |
110 *title = 0; | |
157
7094c8661c05
Return details about menu number in dvdnav_current_title_info()
jcdutton
parents:
146
diff
changeset
|
111 pthread_mutex_unlock(&this->vm_lock); |
193 | 112 return DVDNAV_STATUS_OK; |
157
7094c8661c05
Return details about menu number in dvdnav_current_title_info()
jcdutton
parents:
146
diff
changeset
|
113 } |
114 | 114 } |
158 | 115 if (this->vm->state.domain == VTS_DOMAIN) { |
116 retval = vm_get_current_title_part(this->vm, title, part); | |
117 pthread_mutex_unlock(&this->vm_lock); | |
193 | 118 return retval ? DVDNAV_STATUS_OK : DVDNAV_STATUS_ERR; |
158 | 119 } |
120 printerr("Not in a title or menu."); | |
114 | 121 pthread_mutex_unlock(&this->vm_lock); |
193 | 122 return DVDNAV_STATUS_ERR; |
90 | 123 } |
124 | |
409
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
125 dvdnav_status_t dvdnav_current_title_program(dvdnav_t *this, int32_t *title, int32_t *pgcn, int32_t *pgn) { |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
126 int32_t retval; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
127 int32_t part; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
128 |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
129 pthread_mutex_lock(&this->vm_lock); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
130 if (!this->vm->vtsi || !this->vm->vmgi) { |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
131 printerr("Bad VM state."); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
132 pthread_mutex_unlock(&this->vm_lock); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
133 return DVDNAV_STATUS_ERR; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
134 } |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
135 if (!this->started) { |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
136 printerr("Virtual DVD machine not started."); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
137 pthread_mutex_unlock(&this->vm_lock); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
138 return DVDNAV_STATUS_ERR; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
139 } |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
140 if (!this->vm->state.pgc) { |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
141 printerr("No current PGC."); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
142 pthread_mutex_unlock(&this->vm_lock); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
143 return DVDNAV_STATUS_ERR; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
144 } |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
145 if ( (this->vm->state.domain == VTSM_DOMAIN) |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
146 || (this->vm->state.domain == VMGM_DOMAIN) ) { |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
147 /* Get current Menu ID: into *part. */ |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
148 if(! vm_get_current_menu(this->vm, &part)) { |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
149 pthread_mutex_unlock(&this->vm_lock); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
150 return DVDNAV_STATUS_ERR; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
151 } |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
152 if (part > -1) { |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
153 *title = 0; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
154 *pgcn = this->vm->state.pgcN; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
155 *pgn = this->vm->state.pgN; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
156 pthread_mutex_unlock(&this->vm_lock); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
157 return DVDNAV_STATUS_OK; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
158 } |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
159 } |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
160 if (this->vm->state.domain == VTS_DOMAIN) { |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
161 retval = vm_get_current_title_part(this->vm, title, &part); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
162 *pgcn = this->vm->state.pgcN; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
163 *pgn = this->vm->state.pgN; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
164 pthread_mutex_unlock(&this->vm_lock); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
165 return retval ? DVDNAV_STATUS_OK : DVDNAV_STATUS_ERR; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
166 } |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
167 printerr("Not in a title or menu."); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
168 pthread_mutex_unlock(&this->vm_lock); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
169 return DVDNAV_STATUS_ERR; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
170 } |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
171 |
195 | 172 dvdnav_status_t dvdnav_title_play(dvdnav_t *this, int32_t title) { |
90 | 173 return dvdnav_part_play(this, title, 1); |
0 | 174 } |
175 | |
409
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
176 dvdnav_status_t dvdnav_program_play(dvdnav_t *this, int32_t title, int32_t pgcn, int32_t pgn) { |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
177 int32_t retval; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
178 |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
179 pthread_mutex_lock(&this->vm_lock); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
180 if (!this->vm->vmgi) { |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
181 printerr("Bad VM state."); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
182 pthread_mutex_unlock(&this->vm_lock); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
183 return DVDNAV_STATUS_ERR; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
184 } |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
185 if (!this->started) { |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
186 /* don't report an error but be nice */ |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
187 vm_start(this->vm); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
188 this->started = 1; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
189 } |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
190 if (!this->vm->state.pgc) { |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
191 printerr("No current PGC."); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
192 pthread_mutex_unlock(&this->vm_lock); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
193 return DVDNAV_STATUS_ERR; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
194 } |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
195 if((title < 1) || (title > this->vm->vmgi->tt_srpt->nr_of_srpts)) { |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
196 printerr("Title out of range."); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
197 pthread_mutex_unlock(&this->vm_lock); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
198 return DVDNAV_STATUS_ERR; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
199 } |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
200 |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
201 retval = vm_jump_title_program(this->vm, title, pgcn, pgn); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
202 if (retval) |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
203 this->vm->hop_channel++; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
204 pthread_mutex_unlock(&this->vm_lock); |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
205 |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
206 return retval ? DVDNAV_STATUS_OK : DVDNAV_STATUS_ERR; |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
207 } |
9b8bfc56a7fe
Add dvdnav_program_play & dvdnav_current_title_program
erik
parents:
395
diff
changeset
|
208 |
195 | 209 dvdnav_status_t dvdnav_part_play(dvdnav_t *this, int32_t title, int32_t part) { |
210 int32_t retval; | |
0 | 211 |
114 | 212 pthread_mutex_lock(&this->vm_lock); |
137 | 213 if (!this->vm->vmgi) { |
114 | 214 printerr("Bad VM state."); |
215 pthread_mutex_unlock(&this->vm_lock); | |
193 | 216 return DVDNAV_STATUS_ERR; |
0 | 217 } |
248
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
218 if (!this->started) { |
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
219 /* don't report an error but be nice */ |
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
220 vm_start(this->vm); |
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
221 this->started = 1; |
5124cfd4725d
fix some error conditions (fixes dvdnav_title_part_play())
mroi
parents:
223
diff
changeset
|
222 } |
114 | 223 if (!this->vm->state.pgc) { |
224 printerr("No current PGC."); | |
225 pthread_mutex_unlock(&this->vm_lock); | |
193 | 226 return DVDNAV_STATUS_ERR; |
114 | 227 } |
228 if((title < 1) || (title > this->vm->vmgi->tt_srpt->nr_of_srpts)) { | |
229 printerr("Title out of range."); | |
230 pthread_mutex_unlock(&this->vm_lock); | |
193 | 231 return DVDNAV_STATUS_ERR; |
114 | 232 } |
140 | 233 if((part < 1) || (part > this->vm->vmgi->tt_srpt->title[title-1].nr_of_ptts)) { |
234 printerr("Part out of range."); | |
235 pthread_mutex_unlock(&this->vm_lock); | |
193 | 236 return DVDNAV_STATUS_ERR; |
140 | 237 } |
238 | |
114 | 239 retval = vm_jump_title_part(this->vm, title, part); |
133
d09a81cf65ce
determine correct PG and PTT numbers when seeking across PG boundaries
mroi
parents:
116
diff
changeset
|
240 if (retval) |
d09a81cf65ce
determine correct PG and PTT numbers when seeking across PG boundaries
mroi
parents:
116
diff
changeset
|
241 this->vm->hop_channel++; |
114 | 242 pthread_mutex_unlock(&this->vm_lock); |
0 | 243 |
193 | 244 return retval ? DVDNAV_STATUS_OK : DVDNAV_STATUS_ERR; |
0 | 245 } |
246 | |
195 | 247 dvdnav_status_t dvdnav_part_play_auto_stop(dvdnav_t *this, int32_t title, |
248 int32_t part, int32_t parts_to_play) { | |
114 | 249 /* FIXME: Implement auto-stop */ |
193 | 250 if (dvdnav_part_play(this, title, part) == DVDNAV_STATUS_OK) |
114 | 251 printerr("Not implemented yet."); |
193 | 252 return DVDNAV_STATUS_ERR; |
0 | 253 } |
254 | |
195 | 255 dvdnav_status_t dvdnav_time_play(dvdnav_t *this, int32_t title, |
256 uint64_t time) { | |
0 | 257 /* FIXME: Implement */ |
114 | 258 printerr("Not implemented yet."); |
193 | 259 return DVDNAV_STATUS_ERR; |
0 | 260 } |
261 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
5
diff
changeset
|
262 dvdnav_status_t dvdnav_stop(dvdnav_t *this) { |
114 | 263 pthread_mutex_lock(&this->vm_lock); |
146
7f242ec838fd
do not stop the VM here, get_next_block will do that without races
mroi
parents:
140
diff
changeset
|
264 this->vm->stopped = 1; |
114 | 265 pthread_mutex_unlock(&this->vm_lock); |
193 | 266 return DVDNAV_STATUS_OK; |
0 | 267 } |
268 | |
22
3c1df0cb3aee
Start of rewrite of libdvdnav. Still need to re-implement seeking.
jcdutton
parents:
5
diff
changeset
|
269 dvdnav_status_t dvdnav_go_up(dvdnav_t *this) { |
0 | 270 /* A nice easy function... delegate to the VM */ |
114 | 271 pthread_mutex_lock(&this->vm_lock); |
272 vm_jump_up(this->vm); | |
273 pthread_mutex_unlock(&this->vm_lock); | |
0 | 274 |
193 | 275 return DVDNAV_STATUS_OK; |
0 | 276 } |