073c28bb13242990ba413e9caa1112068e84571d
[librecmc/librecmc.git] / package / fonera-mp3 / src / lib / mp3_states.h
1 /*
2 * FOXMP3 
3 * Copyright (c) 2006 acmesystems.it - john@acmesystems.it
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307USA
18 *
19 * Feedback, Bugs...  info@acmesystems.it 
20 *
21 */
22
23 typedef struct _EVENT {
24         unsigned char *name;
25 } EVENT;
26
27 typedef struct _EVENT_PARAM {
28         int numeric;
29         unsigned char *text;
30 } EVENT_PARAM;
31
32 typedef void (*STATE_ENTER)(int state_last, int event, EVENT_PARAM *param);
33 typedef void (*STATE_LEAVE)(int state_new, int event);
34
35 typedef struct _STATE {
36         unsigned char *name;
37         STATE_ENTER enter;
38         STATE_LEAVE leave;
39 } STATE;
40
41 typedef struct _TRANSITION {
42         int old_state;
43         int event;
44         int new_state;
45 } TRANSITION;
46
47 // a = id, b = name, c = enter, d = leave
48 #define STATE_ADD(a, b, c, d) {                         \
49                 if((a > 0) && (a < MAX_STATE_COUNT)){   \
50                         states[a].name = strdup(b);     \
51                         states[a].enter = c;            \
52                         states[a].leave = d;            \
53                 }                                       \
54         }
55
56 // a = old, b = event, c = new 
57 #define TRANSITION_ADD(a, b, c) {                                       \
58                 if((transition_count >= 0) &&                           \
59                         (transition_count < MAX_TRANSITION_COUNT)){     \
60                         transitions[transition_count].old_state = a;    \
61                         transitions[transition_count].event = b;        \
62                         transitions[transition_count].new_state = c;    \
63                         transition_count++;                             \
64                 }                                                       \
65         }
66
67 // a = id, b = name
68 #define EVENT_ADD(a, b) {                               \
69                 if((a > 0) && (a < MAX_EVENT_COUNT)){   \
70                         events[a].name = strdup(b);     \
71                 }                                       \
72         }
73 #define MAX_EVENT_COUNT         20
74 #define MAX_STATE_COUNT         20
75 #define MAX_TRANSITION_COUNT    60
76         
77 #define MP3_STATE_NONE                  0
78 #define MP3_STATE_STARTUP               1
79 #define MP3_STATE_IDLE                  2
80 #define MP3_STATE_FILE_START            3
81 #define MP3_STATE_FILE_HANDLE           4       
82 #define MP3_STATE_STREAM_START          5
83 #define MP3_STATE_STREAM_HANDLE         6
84 #define MP3_STATE_ERROR                 7
85 #define MP3_STATE_SHUTDOWN              8
86 #define MP3_STATE_DEFAULT               9
87
88 #define MP3_EVENT_TIMEOUT               1
89 #define MP3_EVENT_FILE                  2
90 #define MP3_EVENT_STREAM                3
91 #define MP3_EVENT_STOP                  4
92 #define MP3_EVENT_ERROR                 5
93 #define MP3_EVENT_SHUTDOWN              6
94 #define MP3_EVENT_END                   7
95
96 #define MP3_EVENT_GENERIC_VOLUME        0
97 #define MP3_EVENT_GENERIC_STATE         1
98 #define MP3_EVENT_GENERIC_BASS          2
99 #define MP3_EVENT_GENERIC_PLAYTIME      3
100
101 void state_startup_enter(int state_last, int event, EVENT_PARAM *param);
102 void state_idle_enter(int state_last, int event, EVENT_PARAM *param);
103 void state_file_startup_enter(int state_last, int event, EVENT_PARAM *param);
104 void state_file_startup_leave(int state_new, int event);
105 void state_file_handle_enter(int state_last, int event, EVENT_PARAM *param);
106 void state_file_handle_leave(int state_new, int event);
107 void state_stream_startup_enter(int state_last, int event, EVENT_PARAM *param);
108 void state_stream_startup_leave(int state_last, int event);
109 void state_stream_handle_enter(int state_last, int event, EVENT_PARAM *param);
110 void state_stream_handle_leave(int state_new, int event);
111 void state_error_enter(int state_last, int event, EVENT_PARAM *param);
112 void state_shutdown_enter(int state_last, int event, EVENT_PARAM *param);
113 void state_generic_event(unsigned int event, unsigned char in_int, 
114                 unsigned char *out_uchar);