forked from lipnitsk/mocp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
audio.h
270 lines (240 loc) · 7.72 KB
/
audio.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
#ifndef AUDIO_H
#define AUDIO_H
#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
#endif
/** Sound formats.
*
* Sound format bits. Only one can be set in the format, the exception is
* when we want to hold a list of supported formats - they can be bitwise-or'd.
*/
enum sfmt_fmt
{
SFMT_S8 = 0x00000001, /*!< signed 8-bit */
SFMT_U8 = 0x00000002, /*!< unsigned 8-bit */
SFMT_S16 = 0x00000004, /*!< signed 16-bit */
SFMT_U16 = 0x00000008, /*!< unsigned 16-bit */
SFMT_S32 = 0x00000010, /*!< signed 24-bit (LSB is 0) */
SFMT_U32 = 0x00000020, /*!< unsigned 24-bit (LSB set to 0) */
SFMT_FLOAT = 0x00000040 /*!< float in range -1.0 to 1.0 */
};
/** Sample endianness.
*
* Sample endianness - one of them must be set for 16-bit and 24-bit formats.
*/
enum sfmt_endianness
{
SFMT_LE = 0x00001000, /*!< little-endian */
SFMT_BE = 0x00002000, /*!< big-endian */
/** Define native endianness to SFMT_LE or SFMT_BE. */
#ifdef WORDS_BIGENDIAN
SFMT_NE = SFMT_BE
#else
SFMT_NE = SFMT_LE
#endif
};
/** @name Masks for the sample format.
*
* Masks used to extract only one type of information from the sound format.
*/
/*@{*/
#define SFMT_MASK_FORMAT 0x00000fff /*!< sample format */
#define SFMT_MASK_ENDIANNESS 0x00003000 /*!< sample endianness */
/*@}*/
/** Return a value other than 0 if the sound format seems to be proper. */
#define sound_format_ok(f) (((f) & SFMT_MASK_FORMAT) \
&& (((f) & (SFMT_S8 | SFMT_U8 | SFMT_FLOAT)) \
|| (f) & SFMT_MASK_ENDIANNESS))
/** Change the sample format to new_fmt (without endianness). */
#define sfmt_set_fmt(f, new_fmt) (((f) & ~SFMT_MASK_FORMAT) | (new_fmt))
/** Change the sample format endianness to endian. */
#define sfmt_set_endian(f, endian) (((f) & ~SFMT_MASK_ENDIANNESS) | (endian))
/** Sound parameters.
*
* A structure describing sound parameters. The format is always PCM signed,
* native endian for this machine.
*/
struct sound_params
{
int channels; /*!< Number of channels: 1 or 2 */
int rate; /*!< Rate in Hz */
long fmt; /*!< Format of the samples (SFMT_* bits) */
};
/** Output driver capabilities.
*
* A structure describing the output driver capabilities.
*/
struct output_driver_caps
{
int min_channels; /*!< Minimum number of channels */
int max_channels; /*!< Maximum number of channels */
long formats; /*!< Supported sample formats (or'd sfmt_fmt mask
with endianness') */
};
/** \struct hw_funcs
* Functions to control the audio "driver".
*
* The structure holds pointers to functions that must be provided by the audio
* "driver". All functions are executed only by one thread, so you don't need
* to worry if they are thread safe.
*/
struct hw_funcs
{
/** Initialize the driver.
*
* This function is invoked only once when the MOC server starts.
*
* \param caps Capabilities of the driver which must be filled by the
* function.
* \return 1 on success and 0 otherwise.
*/
int (*init) (struct output_driver_caps *caps);
/** Clean up at exit.
*
* This function is invoked only once when the MOC server exits. The
* audio device is not in use at this moment. The function should close
* any opened devices and free any resources the driver allocated.
* After this function was used, no other functions will be invoked.
*/
void (*shutdown) ();
/** Open the sound device.
*
* This function should open the sound device with the proper
* parameters. The function should return 1 on success and 0 otherwise.
* After returning 1 functions like play(), get_buff_fill() can be used.
*
* The sample rate of the driver can differ from the requested rate.
* If so, get_rate() should return the actual rate.
*
* \param sound_params Pointer to the sound_params structure holding
* the required parameters.
* \return 1 on success and 0 otherwise.
*/
int (*open) (struct sound_params *sound_params);
/** Close the device.
*
* Request for closing the device.
*/
void (*close) ();
/** Play sound.
*
* Play sound provided in the buffer. The sound is in the format
* requested when the open() function was invoked. The function should
* play all sound in the buffer.
*
* \param buff Pointer to the buffer with the sound.
* \param size Size (in bytes) of the buffer.
*
* \return The number of bytes played or a value less than zero on
* error.
*/
int (*play) (const char *buff, const size_t size);
/** Read the volume setting.
*
* Read the current volume setting. This must work regardless if the
* functions open()/close() where used.
*
* \return Volume value from 0% to 100%.
*/
int (*read_mixer) ();
/** Set the volume setting.
*
* Set the volume. This must work regardless if the functions
* open()/close() where used.
*
* \param vol Volume from 0% to 100%.
*/
void (*set_mixer) (int vol);
/** Read the hardware/internal buffer fill.
*
* The function should return the number of bytes of any
* hardware or internal buffers are filled. For example: if we play()
* 4KB, but only 1KB was really played (could be heard by the user),
* the function should return 3072 (3KB).
*
* \return Current hardware/internal buffer fill in bytes.
*/
int (*get_buff_fill) ();
/** Stop playing immediately.
*
* Request that the sound should not be played. This should involve
* flushing any internal buffer filled with data sent by the play()
* function and resetting the device to flush its buffer (if possible).
*
* \return 1 on success or 0 otherwise.
*/
int (*reset) ();
/** Get the current sample rate setting.
*
* Get the actual sample rate setting of the audio driver.
*
* \return Sample rate in Hz.
*/
int (*get_rate) ();
/** Toggle the mixer channel.
*
* Toggle between the first and the second mixer channel.
*/
void (*toggle_mixer_channel) ();
/** Get the mixer channel's name.
*
* Get the currently used mixer channel's name.
*
* \return malloc()ed channel's name.
*/
char * (*get_mixer_channel_name) ();
};
/* Are the parameters p1 and p2 equal? */
#define sound_params_eq(p1, p2) ((p1).fmt == (p2).fmt \
&& (p1).channels == (p2).channels && (p1).rate == (p2).rate)
/* Maximum size of a string needed to hold the value returned by sfmt_str(). */
#define SFMT_STR_MAX 265
char *sfmt_str (const long format, char *msg, const size_t buf_size);
int sfmt_Bps (const long format);
int sfmt_same_bps (const long fmt1, const long fmt2);
void audio_stop ();
void audio_play (const char *fname);
void audio_next ();
void audio_prev ();
void audio_pause ();
void audio_unpause ();
void audio_initialize ();
void audio_exit ();
void audio_seek (const int sec);
void audio_jump_to (const int sec);
int audio_open (struct sound_params *sound_params);
int audio_send_buf (const char *buf, const size_t size);
int audio_send_pcm (const char *buf, const size_t size);
void audio_reset ();
int audio_get_bpf ();
int audio_get_bps ();
int audio_get_buf_fill ();
void audio_close ();
int audio_get_time ();
int audio_get_state ();
int audio_get_prev_state ();
void audio_plist_add (const char *file);
void audio_plist_clear ();
char *audio_get_sname ();
void audio_set_mixer (const int val);
int audio_get_mixer ();
void audio_plist_delete (const char *file);
int audio_get_ftime (const char *file);
void audio_plist_set_time (const char *file, const int time);
void audio_state_started_playing ();
int audio_plist_get_serial ();
void audio_plist_set_serial (const int serial);
struct file_tags *audio_get_curr_tags ();
char *audio_get_mixer_channel_name ();
void audio_toggle_mixer_channel ();
void audio_plist_move (const char *file1, const char *file2);
void audio_queue_add (const char *file);
void audio_queue_delete (const char *file);
void audio_queue_clear ();
void audio_queue_move (const char *file1, const char *file2);
struct plist* audio_queue_get_contents ();
#ifdef __cplusplus
}
#endif
#endif