1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2005 by Linus Nielsen Feltzing
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
23 #include <sys/types.h>
24 /* These must always be included with audio.h for this to compile under
25 cetain conditions. Do it here or else spread the complication around to
27 #if CONFIG_CODEC == SWCODEC
28 #include "pcm_sampr.h"
29 #include "pcm_playback.h"
31 #include "pcm_record.h"
34 #endif /* HAVE_RECORDING */
35 #endif /* CONFIG_CODEC == SWCODEC */
39 #define audio_play(x) sim_audio_play(x)
42 #define AUDIO_STATUS_PLAY 0x0001
43 #define AUDIO_STATUS_PAUSE 0x0002
44 #define AUDIO_STATUS_RECORD 0x0004
45 #define AUDIO_STATUS_PRERECORD 0x0008
46 #define AUDIO_STATUS_ERROR 0x0010
47 #define AUDIO_STATUS_WARNING 0x0020
49 #define AUDIOERR_DISK_FULL 1
51 #define AUDIO_GAIN_LINEIN 0
52 #define AUDIO_GAIN_MIC 1
59 int audiobuf_swapwrite
;
62 int last_dma_chunk_size
;
75 int low_watermark_level
;
76 int lowest_watermark_level
;
79 void audio_init(void);
80 void audio_play(long offset
);
81 void audio_stop(void);
82 void audio_pause(void);
83 void audio_resume(void);
84 void audio_next(void);
85 void audio_prev(void);
86 int audio_status(void);
87 #if CONFIG_CODEC == SWCODEC
88 int audio_track_count(void); /* SWCODEC only */
89 long audio_filebufused(void); /* SWCODEC only */
90 void audio_pre_ff_rewind(void); /* SWCODEC only */
91 #endif /* CONFIG_CODEC == SWCODEC */
92 void audio_ff_rewind(long newtime
);
93 void audio_flush_and_reload_tracks(void);
94 struct mp3entry
* audio_current_track(void);
95 struct mp3entry
* audio_next_track(void);
96 bool audio_has_changed_track(void);
97 void audio_get_debugdata(struct audio_debug
*dbgdata
);
98 void audio_set_crossfade(int type
);
99 #ifndef HAVE_FLASH_STORAGE
100 void audio_set_buffer_margin(int seconds
);
102 unsigned int audio_error(void);
103 void audio_error_clear(void);
104 int audio_get_file_pos(void);
105 void audio_beep(int duration
);
106 void audio_init_playback(void);
107 /* Required call when audio buffer is require for some other purpose */
108 unsigned char *audio_get_buffer(bool talk_buf
, size_t *buffer_size
);
110 /* Required call when codec IRAM is needed for some other purpose */
111 void audio_iram_steal(void);
115 enum rec_channel_modes
117 __CHN_MODE_START_INDEX
= -1,
125 #if CONFIG_CODEC == SWCODEC
126 /* channel mode capability bits */
127 #define CHN_CAP_STEREO (1 << CHN_MODE_STEREO)
128 #define CHN_CAP_MONO (1 << CHN_MODE_MONO)
129 #define CHN_CAP_ALL (CHN_CAP_STEREO | CHN_CAP_MONO)
130 #endif /* CONFIG_CODEC == SWCODEC */
132 /* the enums below must match prestr[] in recording.c */
135 AUDIO_SRC_PLAYBACK
= -1, /* Virtual source */
136 HAVE_MIC_IN_(AUDIO_SRC_MIC
,)
137 HAVE_LINE_IN_(AUDIO_SRC_LINEIN
,)
138 HAVE_SPDIF_IN_(AUDIO_SRC_SPDIF
,)
139 HAVE_FMRADIO_IN_(AUDIO_SRC_FMRADIO
,)
141 AUDIO_SRC_MAX
= AUDIO_NUM_SOURCES
-1,
142 AUDIO_SRC_DEFAULT
= AUDIO_SRC_PLAYBACK
145 extern int audio_channels
;
146 extern int audio_output_source
;
148 #ifdef HAVE_RECORDING
149 /* Recordable source implies it has the input as well */
151 /* For now there's no restrictions on any targets with which inputs
152 are recordable so define them as equivalent - if they do differ,
153 special handling is needed right now. */
156 __REC_SRC_FIRST
= -1,
157 HAVE_MIC_REC_(REC_SRC_MIC
,)
158 HAVE_LINE_REC_(REC_SRC_LINEIN
,)
159 HAVE_SPDIF_REC_(REC_SRC_SPDIF
,)
160 HAVE_FMRADIO_REC_(REC_SRC_FMRADIO
,)
163 #endif /* HAVE_RECORDING */
165 #if CONFIG_CODEC == SWCODEC
166 /* selects a source to monitor for recording or playback */
167 #define SRCF_PLAYBACK 0x0000 /* default */
168 #define SRCF_RECORDING 0x1000
170 /* for AUDIO_SRC_FMRADIO */
171 #define SRCF_FMRADIO_PLAYING 0x0000 /* default */
172 #define SRCF_FMRADIO_PAUSED 0x2000
176 #ifdef HAVE_RECORDING
177 /* parameters for audio_set_recording_options */
178 struct audio_recording_options
183 int rec_prerecord_time
;
184 #if CONFIG_CODEC == SWCODEC
185 int rec_source_flags
; /* for rec_set_source */
186 struct encoder_config enc_config
;
193 /* audio recording functions */
194 void audio_init_recording(unsigned int buffer_offset
);
195 void audio_close_recording(void);
196 void audio_record(const char *filename
);
197 void audio_stop_recording(void);
198 void audio_pause_recording(void);
199 void audio_resume_recording(void);
200 void audio_new_file(const char *filename
);
201 void audio_set_recording_options(struct audio_recording_options
*options
);
202 void audio_set_recording_gain(int left
, int right
, int type
);
203 unsigned long audio_recorded_time(void);
204 unsigned long audio_num_recorded_bytes(void);
206 #if CONFIG_CODEC == SWCODEC
207 /* SWCODEC recoring functions */
209 bool audio_load_encoder(int afmt
);
210 void audio_remove_encoder(void);
211 unsigned char *audio_get_recording_buffer(size_t *buffer_size
);
212 #endif /* CONFIG_CODEC == SWCODEC */
214 #endif /* HAVE_RECORDING */
216 #if CONFIG_CODEC == SWCODEC
217 /* SWCODEC misc. audio functions */
218 #if INPUT_SRC_CAPS != 0
220 void audio_set_input_source(int source
, unsigned flags
);
221 /* audio_input_mux: target-specific implementation used by audio_set_source
222 to set hardware inputs and audio paths */
223 void audio_input_mux(int source
, unsigned flags
);
224 void audio_set_output_source(int source
);
225 #endif /* INPUT_SRC_CAPS */
226 #endif /* CONFIG_CODEC == SWCODEC */
229 /* returns index into rec_master_sampr_list */
230 int audio_get_spdif_sample_rate(void);
231 /* > 0: monitor EBUin, 0: Monitor IISrecv, <0: reset only */
232 void audio_spdif_set_monitor(int monitor_spdif
);
233 #endif /* HAVE_SPDIF_IN */
235 unsigned long audio_prev_elapsed(void);
238 /***********************************************************************/
239 /* audio event handling */
241 /* subscribe to one or more audio event(s) by OR'ing together the desired */
242 /* event IDs (defined below); a handler is called with a solitary event ID */
243 /* (so switch() is okay) and possibly some useful data (depending on the */
244 /* event); a handler must return one of the return codes defined below */
246 typedef int (*AUDIO_EVENT_HANDLER
)(unsigned short event
, unsigned long data
);
248 void audio_register_event_handler(AUDIO_EVENT_HANDLER handler
, unsigned short mask
);
250 /***********************************************************************/
251 /* handler return codes */
253 #define AUDIO_EVENT_RC_IGNORED 200
254 /* indicates that no action was taken or the event was not recognized */
256 #define AUDIO_EVENT_RC_HANDLED 201
257 /* indicates that the event was handled and some action was taken which renders
258 the original event invalid; USE WITH CARE!; this return code aborts all further
259 processing of the given event */
261 /***********************************************************************/
262 /* audio event IDs */
264 #define AUDIO_EVENT_POS_REPORT (1<<0)
265 /* sends a periodic song position report to handlers; a report is sent on
266 each kernal tick; the number of ticks per second is defined by HZ; on each
267 report the current song position is passed in 'data'; if a handler takes an
268 action that changes the song or the song position it must return
269 AUDIO_EVENT_RC_HANDLED which suppresses the event for any remaining handlers */
271 #define AUDIO_EVENT_END_OF_TRACK (1<<1)
272 /* generated when the end of the currently playing track is reached; no
273 data is passed; if the handler implements some alternate end-of-track
274 processing it should return AUDIO_EVENT_RC_HANDLED which suppresses the
275 event for any remaining handlers as well as the normal end-of-track