00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef ALSADRIVER_H
00026 #define ALSADRIVER_H
00027
00028 #include "Driver.h"
00029
00030 #include <alsa/asoundlib.h>
00031 #include <sys/param.h>
00032 #include <memops.h>
00033 #include "bitset.h"
00034
00035 #include "defines.h"
00036
00037 #if __BYTE_ORDER == __LITTLE_ENDIAN
00038 #define IS_LE 0
00039 #define IS_BE 1
00040 #elif __BYTE_ORDER == __BIG_ENDIAN
00041 #define IS_LE 1
00042 #define IS_BE 0
00043 #endif
00044
00045
00046 class AlsaDriver : public Driver
00047 {
00048 public:
00049 AlsaDriver(AudioDevice* dev, int rate, nframes_t bufferSize);
00050 ~AlsaDriver();
00051
00052 int start();
00053 int stop();
00054 int _read(nframes_t nframes);
00055 int _write(nframes_t nframes);
00056 int _null_cycle(nframes_t nframes);
00057 int _run_cycle();
00058 int attach();
00059 int detach();
00060 int bufsize(nframes_t nframes);
00061 int restart();
00062 int setup(bool capture=true, bool playback=true, const QString& pcmName="hw:0", const QString& dither="None");
00063
00064 QString get_device_name();
00065 QString get_device_longname();
00066 static QString alsa_device_name(bool longname = false, int devicenumber=0);
00067
00068 private:
00069 void setup_io_function_pointers();
00070 void silence_untouched_channels(nframes_t nframes);
00071 void release_channel_dependent_memory();
00072 int configure_stream(char *device_name,
00073 const char *stream_name,
00074 snd_pcm_t *handle,
00075 snd_pcm_hw_params_t *hw_params,
00076 snd_pcm_sw_params_t *sw_params,
00077 unsigned int *nperiodsp,
00078 unsigned long *nchns,
00079 unsigned long sample_width);
00080 int set_parameters(nframes_t frames_per_cycle, nframes_t user_nperiods, nframes_t rate);
00081 int xrun_recovery(float *delayed_usecs);
00082 int reset_parameters(nframes_t frames_per_cycle, nframes_t user_nperiods, nframes_t rate);
00083 int alsa_driver_set_parameters(nframes_t frames_per_cycle, nframes_t user_nperiods, nframes_t rate);
00084 int get_channel_addresses ( snd_pcm_uframes_t *capture_avail,
00085 snd_pcm_uframes_t *playback_avail,
00086 snd_pcm_uframes_t *capture_offset,
00087 snd_pcm_uframes_t *playback_offset
00088 );
00089
00090 int wait(int extra_fd, int *status, float *delayed_usecs);
00091
00092
00093 inline void mark_channel_done (channel_t chn)
00094 {
00095 bitset_remove (channels_not_done, chn);
00096 silent[chn] = 0;
00097 }
00098
00099 inline void silence_on_channel (channel_t chn, nframes_t nframes)
00100 {
00101 if (playback_interleaved) {
00102 memset_interleave
00103 (playback_addr[chn],
00104 0, nframes * playback_sample_bytes,
00105 interleave_unit,
00106 playback_interleave_skip[chn]);
00107 } else {
00108 memset (playback_addr[chn], 0, nframes * playback_sample_bytes);
00109 }
00110 mark_channel_done (chn);
00111 }
00112
00113 inline void silence_on_channel_no_mark (channel_t chn, nframes_t nframes)
00114 {
00115 if (playback_interleaved) {
00116 memset_interleave
00117 (playback_addr[chn],
00118 0, nframes * playback_sample_bytes,
00119 interleave_unit,
00120 playback_interleave_skip[chn]);
00121 } else {
00122 memset (playback_addr[chn], 0, nframes * playback_sample_bytes);
00123 }
00124 }
00125
00126 inline void read_from_channel (channel_t channel, audio_sample_t *buf, nframes_t nsamples)
00127 {
00128 read_via_copy (buf, capture_addr[channel], nsamples, capture_interleave_skip[channel]);
00129 }
00130
00131 inline void write_to_channel (channel_t channel, audio_sample_t *buf, nframes_t nsamples)
00132 {
00133 write_via_copy (playback_addr[channel], buf, nsamples, playback_interleave_skip[channel], dither_state + channel);
00134 mark_channel_done (channel);
00135 }
00136
00137 inline void copy_channel (channel_t input_channel, channel_t output_channel, nframes_t nsamples)
00138 {
00139 channel_copy ( playback_addr[output_channel],
00140 capture_addr[input_channel],
00141 nsamples * playback_sample_bytes,
00142 playback_interleave_skip[output_channel],
00143 capture_interleave_skip[input_channel]);
00144 mark_channel_done (output_channel);
00145 }
00146
00147
00148
00149 typedef void (*ReadCopyFunction) ( audio_sample_t *dst,
00150 char *src,
00151 unsigned long src_bytes,
00152 unsigned long src_skip_bytes
00153 );
00154 typedef void (*WriteCopyFunction) ( char *dst,
00155 audio_sample_t *src,
00156 unsigned long src_bytes,
00157 unsigned long dst_skip_bytes,
00158 dither_state_t *state
00159 );
00160 typedef void (*CopyCopyFunction) ( char *dst,
00161 char *src,
00162 unsigned long src_bytes,
00163 unsigned long dst_skip_bytes,
00164 unsigned long src_skip_byte
00165 );
00166
00167 int poll_timeout;
00168 trav_time_t poll_last;
00169 trav_time_t poll_next;
00170 char **playback_addr;
00171 char **capture_addr;
00172 const snd_pcm_channel_area_t *capture_areas;
00173 const snd_pcm_channel_area_t *playback_areas;
00174 struct pollfd *pfd;
00175 unsigned int playback_nfds;
00176 unsigned int capture_nfds;
00177 unsigned long interleave_unit;
00178 unsigned long *capture_interleave_skip;
00179 unsigned long *playback_interleave_skip;
00180 channel_t max_nchannels;
00181 channel_t user_nchannels;
00182 channel_t playback_nchannels;
00183 channel_t capture_nchannels;
00184 unsigned long playback_sample_bytes;
00185 unsigned long capture_sample_bytes;
00186
00187
00188 unsigned long *silent;
00189 char *alsa_name_playback;
00190 char *alsa_name_capture;
00191 char *alsa_driver;
00192 bitset_t channels_not_done;
00193 bitset_t channels_done;
00194 snd_pcm_format_t playback_sample_format;
00195 snd_pcm_format_t capture_sample_format;
00196 float max_sample_val;
00197 unsigned long user_nperiods;
00198 unsigned int playback_nperiods;
00199 unsigned int capture_nperiods;
00200 unsigned long last_mask;
00201 snd_ctl_t *ctl_handle;
00202 snd_pcm_t *playback_handle;
00203 snd_pcm_t *capture_handle;
00204 snd_pcm_hw_params_t *playback_hw_params;
00205 snd_pcm_sw_params_t *playback_sw_params;
00206 snd_pcm_hw_params_t *capture_hw_params;
00207 snd_pcm_sw_params_t *capture_sw_params;
00208
00209 char soft_mode;
00210 char capture_and_playback_not_synced;
00211 char playback_interleaved;
00212 char capture_interleaved;
00213 char quirk_bswap;
00214
00215 ReadCopyFunction read_via_copy;
00216 WriteCopyFunction write_via_copy;
00217 CopyCopyFunction channel_copy;
00218
00219 int process_count;
00220
00221 };
00222
00223 #endif
00224
00225