Add new tarball generation script.
[maemo-rb.git] / firmware / export / audio.h
blob5309ddd1d12a583431e11c63dfcdbc4388877b80
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2005 by Linus Nielsen Feltzing
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
21 #ifndef AUDIO_H
22 #define AUDIO_H
24 #include <stdbool.h>
25 #include <string.h> /* size_t */
26 #include "config.h"
27 /* These must always be included with audio.h for this to compile under
28 cetain conditions. Do it here or else spread the complication around to
29 many files. */
30 #if CONFIG_CODEC == SWCODEC
31 #include "pcm_sampr.h"
32 #include "pcm.h"
33 #ifdef HAVE_RECORDING
34 #include "enc_base.h"
35 #endif /* HAVE_RECORDING */
36 #endif /* CONFIG_CODEC == SWCODEC */
38 #define AUDIO_STATUS_PLAY 0x0001
39 #define AUDIO_STATUS_PAUSE 0x0002
40 #define AUDIO_STATUS_RECORD 0x0004
41 #define AUDIO_STATUS_PRERECORD 0x0008
42 #define AUDIO_STATUS_ERROR 0x0010
43 #define AUDIO_STATUS_WARNING 0x0020
45 #define AUDIOERR_DISK_FULL 1
47 #define AUDIO_GAIN_LINEIN 0
48 #define AUDIO_GAIN_MIC 1
51 void audio_init(void) INIT_ATTR;
52 void audio_play(long offset);
53 void audio_stop(void);
54 /* Stops audio from serving playback and frees resources*/
55 void audio_hard_stop(void);
56 void audio_pause(void);
57 void audio_resume(void);
58 void audio_next(void);
59 void audio_prev(void);
60 int audio_status(void);
61 /* size of the audio buffer */
62 size_t audio_buffer_size(void);
63 /* size of the buffer available for allocating memory from the audio buffer using core_*()
64 * returns core_available() if audio buffer is not allocated yet */
65 size_t audio_buffer_available(void);
66 void audio_ff_rewind(long newpos);
67 void audio_flush_and_reload_tracks(void);
68 struct mp3entry* audio_current_track(void);
69 struct mp3entry* audio_next_track(void);
70 bool audio_peek_track(struct mp3entry* id3, int offset);
71 #ifdef HAVE_DISK_STORAGE
72 void audio_set_buffer_margin(int setting);
73 #endif
74 void audio_error_clear(void);
75 int audio_get_file_pos(void);
76 void audio_beep(int duration);
78 /* Required call when audio buffer is required for some other purpose */
79 /* implemented in apps but called from firmware(!) */
80 unsigned char *audio_get_buffer(bool talk_buf, size_t *buffer_size);
82 #if CONFIG_CODEC == SWCODEC
83 void audio_next_dir(void);
84 void audio_prev_dir(void);
86 #else /* hwcodec only */
87 struct audio_debug
89 int audiobuflen;
90 int audiobuf_write;
91 int audiobuf_swapwrite;
92 int audiobuf_read;
94 int last_dma_chunk_size;
96 bool dma_on;
97 bool playing;
98 bool play_pending;
99 bool is_playing;
100 bool filling;
101 bool dma_underrun;
103 int unplayed_space;
104 int playable_space;
105 int unswapped_space;
107 int low_watermark_level;
108 int lowest_watermark_level;
111 void audio_get_debugdata(struct audio_debug *dbgdata);
112 /* unsigned int audio_error(void); - unused function */
113 void audio_init_playback(void);
115 #define audio_next_dir() ({ })
116 #define audio_prev_dir() ({ })
118 #endif
120 /* channel modes */
121 enum rec_channel_modes
123 __CHN_MODE_START_INDEX = -1,
125 CHN_MODE_STEREO,
126 CHN_MODE_MONO,
128 CHN_NUM_MODES
131 #if CONFIG_CODEC == SWCODEC
132 /* channel mode capability bits */
133 #define CHN_CAP_STEREO (1 << CHN_MODE_STEREO)
134 #define CHN_CAP_MONO (1 << CHN_MODE_MONO)
135 #define CHN_CAP_ALL (CHN_CAP_STEREO | CHN_CAP_MONO)
136 #endif /* CONFIG_CODEC == SWCODEC */
138 /* the enums below must match prestr[] in recording.c */
139 enum audio_sources
141 AUDIO_SRC_PLAYBACK = -1, /* Virtual source */
142 HAVE_MIC_IN_(AUDIO_SRC_MIC,)
143 HAVE_LINE_IN_(AUDIO_SRC_LINEIN,)
144 HAVE_SPDIF_IN_(AUDIO_SRC_SPDIF,)
145 HAVE_FMRADIO_IN_(AUDIO_SRC_FMRADIO,)
146 AUDIO_NUM_SOURCES,
147 AUDIO_SRC_MAX = AUDIO_NUM_SOURCES-1,
148 AUDIO_SRC_DEFAULT = AUDIO_SRC_PLAYBACK
151 extern int audio_channels;
152 extern int audio_output_source;
154 #ifdef HAVE_RECORDING
155 /* Recordable source implies it has the input as well */
157 /* For now there's no restrictions on any targets with which inputs
158 are recordable so define them as equivalent - if they do differ,
159 special handling is needed right now. */
160 enum rec_sources
162 __REC_SRC_FIRST = -1,
163 HAVE_MIC_REC_(REC_SRC_MIC,)
164 HAVE_LINE_REC_(REC_SRC_LINEIN,)
165 HAVE_SPDIF_REC_(REC_SRC_SPDIF,)
166 HAVE_FMRADIO_REC_(REC_SRC_FMRADIO,)
167 REC_NUM_SOURCES
169 #endif /* HAVE_RECORDING */
171 #if CONFIG_CODEC == SWCODEC
172 /* selects a source to monitor for recording or playback */
173 #define SRCF_PLAYBACK 0x0000 /* default */
174 #define SRCF_RECORDING 0x1000
175 #if CONFIG_TUNER
176 /* for AUDIO_SRC_FMRADIO */
177 #define SRCF_FMRADIO_PLAYING 0x0000 /* default */
178 #define SRCF_FMRADIO_PAUSED 0x2000
179 #endif
180 #endif
182 #ifdef HAVE_RECORDING
183 /* parameters for audio_set_recording_options */
184 struct audio_recording_options
186 int rec_source;
187 int rec_frequency;
188 int rec_channels;
189 int rec_prerecord_time;
190 #if CONFIG_CODEC == SWCODEC
191 int rec_mono_mode;
192 int rec_source_flags; /* for rec_set_source */
193 struct encoder_config enc_config;
194 #else
195 int rec_quality;
196 bool rec_editable;
197 #endif
200 /* audio recording functions */
201 void audio_init_recording(void);
202 void audio_close_recording(void);
203 void audio_record(const char *filename);
204 void audio_stop_recording(void);
205 void audio_pause_recording(void);
206 void audio_resume_recording(void);
207 void audio_new_file(const char *filename);
208 void audio_set_recording_options(struct audio_recording_options *options);
209 void audio_set_recording_gain(int left, int right, int type);
210 unsigned long audio_recorded_time(void);
211 unsigned long audio_num_recorded_bytes(void);
213 #if CONFIG_CODEC == SWCODEC
214 /* SWCODEC recording functions */
215 /* playback.c */
216 bool audio_load_encoder(int afmt);
217 void audio_remove_encoder(void);
218 unsigned char *audio_get_recording_buffer(size_t *buffer_size);
219 #endif /* CONFIG_CODEC == SWCODEC */
221 #endif /* HAVE_RECORDING */
223 #if CONFIG_CODEC == SWCODEC
224 /* SWCODEC misc. audio functions */
225 #if INPUT_SRC_CAPS != 0
226 /* audio.c */
227 void audio_set_input_source(int source, unsigned flags);
228 /* audio_input_mux: target-specific implementation used by audio_set_source
229 to set hardware inputs and audio paths */
230 void audio_input_mux(int source, unsigned flags);
231 void audio_set_output_source(int source);
232 #endif /* INPUT_SRC_CAPS */
233 #endif /* CONFIG_CODEC == SWCODEC */
235 #ifdef HAVE_SPDIF_IN
236 /* returns index into rec_master_sampr_list */
237 int audio_get_spdif_sample_rate(void);
238 /* > 0: monitor EBUin, 0: Monitor IISrecv, <0: reset only */
239 void audio_spdif_set_monitor(int monitor_spdif);
240 #endif /* HAVE_SPDIF_IN */
242 unsigned long audio_prev_elapsed(void);
244 #if CONFIG_CODEC != SWCODEC
245 /***********************************************************************/
246 /* audio event handling */
248 /* subscribe to one or more audio event(s) by OR'ing together the desired */
249 /* event IDs (defined below); a handler is called with a solitary event ID */
250 /* (so switch() is okay) and possibly some useful data (depending on the */
251 /* event); a handler must return one of the return codes defined below */
253 typedef int (*AUDIO_EVENT_HANDLER)(unsigned short event, unsigned long data);
255 void audio_register_event_handler(AUDIO_EVENT_HANDLER handler, unsigned short mask);
257 /***********************************************************************/
258 /* handler return codes */
260 #define AUDIO_EVENT_RC_IGNORED 200
261 /* indicates that no action was taken or the event was not recognized */
263 #define AUDIO_EVENT_RC_HANDLED 201
264 /* indicates that the event was handled and some action was taken which renders
265 the original event invalid; USE WITH CARE!; this return code aborts all further
266 processing of the given event */
268 /***********************************************************************/
269 /* audio event IDs */
271 #define AUDIO_EVENT_POS_REPORT (1<<0)
272 /* sends a periodic song position report to handlers; a report is sent on
273 each kernal tick; the number of ticks per second is defined by HZ; on each
274 report the current song position is passed in 'data'; if a handler takes an
275 action that changes the song or the song position it must return
276 AUDIO_EVENT_RC_HANDLED which suppresses the event for any remaining handlers */
278 #define AUDIO_EVENT_END_OF_TRACK (1<<1)
279 /* generated when the end of the currently playing track is reached; no
280 data is passed; if the handler implements some alternate end-of-track
281 processing it should return AUDIO_EVENT_RC_HANDLED which suppresses the
282 event for any remaining handlers as well as the normal end-of-track
283 processing */
285 #endif
286 #endif