1 /* ===========================================================================
3 * This is cd_control() function: accept orders from the ui player and send
4 * the appropriate commands to libworkman.
6 * Please do *not* modify this function as it is used without changes by
8 * ===========================================================================
9 * Copyright (c) 1999 Denis Bourez and Rob Malda. All rights reserved.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in the
19 * documentation and/or other materials provided with the distribution.
20 * 3. All advertising materials mentioning features or use of this software
21 * must display the following acknowledgement:
22 * This product includes software developed by Denis Bourez & Rob Malda
23 * 4. Neither the name of the author nor the names of any co-contributors
24 * may be used to endorse or promote products derived from this software
25 * without specific prior written permission.
27 * THIS SOFTWARE IS PROVIDED BY DENIS BOUREZ AND CONTRIBUTORS ``AS IS'' AND
28 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 * ARE DISCLAIMED. IN NO EVENT SHALL DENIS BOUREZ, ROB MALDA OR CONTRIBUTORS BE
31 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
38 * ===========================================================================
41 #define CD_C_VERSION "1.4"
47 static int pos_changed
= FALSE
;
57 if (cur_cdmode
!= WM_CDM_EJECTED
) {
58 if (cd
->trk
[cur_track
- 1].data
) datatrack
= 1;
62 if ((cur_ntracks
== 1) && (cd
->trk
[cur_track
- 1].data
)) {
64 /* only one track, and it's a data track. We ignore
65 all commands to avoid some funny things. Only the EJECT
66 commands are allowed */
68 if ((order
!= STOP
) && (order
!= EJECT
)) {
85 if (cur_track
< 1) cur_track
= 1;
87 /* don't play data tracks: */
89 if (! cd
->trk
[cur_track
- 1].data
) {
90 if (cur_cdmode
!= WM_CDM_EJECTED
) {
91 if (cur_cdmode
!= WM_CDM_PAUSED
) {
94 do_autorepeat
= FALSE
;
97 /* skip data and avoid tracks */
98 while (((cd
->trk
[cur_track
- 1].data
) || ((cd
->trk
[cur_track
- 1].avoid
== 1) && (!ignore_avoid
)) ) && (cur_track
<= cur_ntracks
)) cur_track
++;
100 if (cur_track
> cur_ntracks
) cur_track
--;
101 if (!(cd
->trk
[cur_track
- 1].data
)) {
103 wm_cd_play(cur_track
, 0, cur_ntracks
+ 1);
115 cur_track
= wanted_track
;
117 wm_cd_play(cur_track
, 0, cur_ntracks
+ 1);
118 cur_cdmode
= WM_CDM_PLAYING
;
123 if (cur_cdmode
== WM_CDM_PLAYING
) {
128 case STOP
: /* Civilized handler: STOP and EJECT combined */
131 if ((cur_cdmode
== WM_CDM_PLAYING
) || (cur_cdmode
== WM_CDM_PAUSED
)) {
132 cur_cdmode
= WM_CDM_PAUSED
;
134 cur_cdmode
= WM_CDM_STOPPED
;
136 if (cur_cdmode
!= WM_CDM_EJECTED
) {
144 case STOPONLY
: /* STOP, no more. Doesn't eject if CD is already stopped */
147 if ((cur_cdmode
== WM_CDM_PLAYING
) || (cur_cdmode
== WM_CDM_PAUSED
)) {
148 cur_cdmode
= WM_CDM_PAUSED
;
150 cur_cdmode
= WM_CDM_STOPPED
;
155 case EJECT
: /* Troll handler: don't try to guess the current mode, just eject */
156 if (cur_cdmode
!= WM_CDM_EJECTED
) {
164 case CLOSETRAY
: /* let's try this */
165 if (cur_cdmode
== WM_CDM_EJECTED
) {
166 /* commented, as current libworkman crashes when it receive this order */
167 /*wm_cd_closetray();*/
171 case UPTRACK
: /* next track */
174 if (pos_changed
) cur_track
= wanted_track
;
176 if (cur_track
+ 1 > cur_ntracks
) {
181 if (cur_cdmode
== WM_CDM_PAUSED
) {
183 wanted_track
= cur_track
;
185 if (cur_cdmode
== WM_CDM_PLAYING
) {
187 wm_cd_play(cur_track
, 0, cur_ntracks
+ 1);
191 case DNTRACK
: /* previous track */
194 if (pos_changed
) cur_track
= wanted_track
;
196 if (cur_cdmode
== WM_CDM_PAUSED
) {
197 if (cur_pos_rel
< 2 || pos_changed
) cur_track
--;
200 } else if (cur_cdmode
== WM_CDM_PLAYING
) {
201 if (cur_pos_rel
< 2) cur_track
--;
206 if (cur_track
< 1) cur_track
= cur_ntracks
;
207 if (cur_cdmode
== WM_CDM_PAUSED
) {
209 wanted_track
= cur_track
;
211 if (cur_cdmode
== WM_CDM_PLAYING
) {
213 wm_cd_play(cur_track
, 0, cur_ntracks
+ 1);
217 case DIRECTTRACK
: /* direct access to a random track */
221 if (direct_track
< 1) direct_track
= 1;
223 if (cur_cdmode
== WM_CDM_PAUSED
) pos_changed
= TRUE
;
224 cur_track
= direct_track
;
225 if (cur_track
>= cur_ntracks
+ 1) cur_track
= 1;
227 /* if it's a data track, skip it */
228 while ((cd
->trk
[cur_track
- 1].data
) && (cur_track
<= cur_ntracks
)) cur_track
++;
230 if (cur_cdmode
== WM_CDM_PLAYING
) {
232 wm_cd_play(cur_track
, 0, cur_ntracks
+ 1);
239 if (cur_cdmode
== WM_CDM_PLAYING
) {
241 wm_cd_play(cur_track
, cur_pos_rel
+ cue_time
, cur_ntracks
+ 1);
248 if ( (cur_cdmode
== WM_CDM_PLAYING
) && ( (cur_pos_rel
- cue_time
) >= 0 ) ) {
250 wm_cd_play(cur_track
, cur_pos_rel
- cue_time
, cur_ntracks
+ 1);
258 if (cur_cdmode
== WM_CDM_PLAYING
) {
260 wm_cd_play(cur_track
, 0, cur_ntracks
+ 1);
261 } else if (cur_cdmode
== WM_CDM_PAUSED
) {
263 wanted_track
= cur_track
;
270 cur_track
= cur_ntracks
;
271 if (cur_cdmode
== WM_CDM_PLAYING
) {
273 wm_cd_play(cur_track
, 0, cur_ntracks
+ 1);
274 } else if (cur_cdmode
== WM_CDM_PAUSED
) {
276 wanted_track
= cur_track
;
281 if ( (loop_2
> loop_1
) ||
282 (loop_end_track
> loop_start_track
) ) {
284 if (loop_start_track
== 0) loop_start_track
= 1;
286 if ( ( loop_2
> loop_1
)
287 || ( loop_start_track
!= loop_end_track
) )
288 currenttrack
= loop_start_track
;
290 loop_end_track
= cur_ntracks
;
291 currenttrack
= loop_start_track
= 1;
294 thiscd
.trk
[ loop_end_track
- 1 ].length
- 1;
296 wm_cd_play(loop_start_track
, loop_1
, cur_ntracks
+ 1);
304 case DIRECTACCESS
: /* direct access to a random position of the current track */
305 if (direct_access
< 0) direct_access
= 0;
309 wm_cd_play(cur_track
, direct_access
, cur_ntracks
+ 1);
314 if (direct_access
< 0) direct_access
= 0;
318 wm_cd_play(1, direct_access
, cur_ntracks
+ 1);
325 wm_cd_play(cur_track
, 0, cur_ntracks
+ 1);
333 currenttrack
= cur_track
;
335 if (cur_track
+1 > cur_ntracks
) currenttrack
= 1;
336 else currenttrack
= cur_track
+ 1;
338 wm_cd_play(currenttrack
, 0, cur_ntracks
+ 1);
342 if ( (loop_1
> 0) && (loop_start_track
> 0) ) {
345 currenttrack
= loop_start_track
;
347 wm_cd_play(loop_start_track
, loop_1
, cur_ntracks
+ 1);
356 char *cd_control_version(void)
360 wm_strmcat(&s
, CD_C_VERSION
);