21 #ifndef __jack_alsa_driver_h__    22 #define __jack_alsa_driver_h__    24 #include <alsa/asoundlib.h>    27 #if __BYTE_ORDER == __LITTLE_ENDIAN    30 #elif __BYTE_ORDER == __BIG_ENDIAN    42 #include "alsa_midi.h"    49 typedef void (*ReadCopyFunction)  (jack_default_audio_sample_t *dst, 
char *src,
    50                                    unsigned long src_bytes,
    51                                    unsigned long src_skip_bytes);
    52 typedef void (*WriteCopyFunction) (
char *dst, jack_default_audio_sample_t *src,
    53                                    unsigned long src_bytes,
    54                                    unsigned long dst_skip_bytes,
    62     jack_time_t                   poll_last;
    63     jack_time_t                   poll_next;
    66     const snd_pcm_channel_area_t *capture_areas;
    67     const snd_pcm_channel_area_t *playback_areas;
    69     unsigned int                  playback_nfds;
    70     unsigned int                  capture_nfds;
    71     unsigned long                 interleave_unit;
    72     unsigned long                *capture_interleave_skip;
    73     unsigned long                *playback_interleave_skip;
    74     channel_t                     max_nchannels;
    75     channel_t                     user_nchannels;
    76     channel_t                     playback_nchannels;
    77     channel_t                     capture_nchannels;
    78     unsigned long                 playback_sample_bytes;
    79     unsigned long                 capture_sample_bytes;
    81     jack_nframes_t                frame_rate;
    82     jack_nframes_t                frames_per_cycle;
    83     jack_nframes_t                capture_frame_latency;
    84     jack_nframes_t                playback_frame_latency;
    86     unsigned long                *silent;
    87     char                         *alsa_name_playback;
    88     char                         *alsa_name_capture;
    90     bitset_t                      channels_not_done;
    91     bitset_t                      channels_done;
    92     snd_pcm_format_t              playback_sample_format;
    93     snd_pcm_format_t              capture_sample_format;
    95     unsigned long                 user_nperiods;
    96     unsigned int                  playback_nperiods;
    97     unsigned int                  capture_nperiods;
    98     unsigned long                 last_mask;
    99     snd_ctl_t                    *ctl_handle;
   100     snd_pcm_t                    *playback_handle;
   101     snd_pcm_t                    *capture_handle;
   102     snd_pcm_hw_params_t          *playback_hw_params;
   103     snd_pcm_sw_params_t          *playback_sw_params;
   104     snd_pcm_hw_params_t          *capture_hw_params;
   105     snd_pcm_sw_params_t          *capture_sw_params;
   107     ClockSyncStatus              *clock_sync_data;
   108     jack_client_t                *client;
   113     unsigned long input_monitor_mask;
   119     char capture_and_playback_not_synced;
   120     char playback_interleaved;
   121     char capture_interleaved;
   122     char with_monitor_ports;
   123     char has_clock_sync_reporting;
   124     char has_hw_monitoring;
   125     char has_hw_metering;
   128     ReadCopyFunction read_via_copy;
   129     WriteCopyFunction write_via_copy;
   134     SampleClockMode clock_mode;
   135     JSList *clock_sync_listeners;
   136     pthread_mutex_t clock_sync_lock;
   137     unsigned long next_clock_sync_listener_id;
   152 alsa_driver_mark_channel_done (
alsa_driver_t *driver, channel_t chn) {
   153         bitset_remove (driver->channels_not_done, chn);
   154         driver->silent[chn] = 0;
   158 alsa_driver_silence_on_channel (
alsa_driver_t *driver, channel_t chn,
   159                                 jack_nframes_t nframes) {
   160         if (driver->playback_interleaved) {
   162                         (driver->playback_addr[chn],
   163                          0, nframes * driver->playback_sample_bytes,
   164                          driver->interleave_unit,
   165                          driver->playback_interleave_skip[chn]);
   167                 memset (driver->playback_addr[chn], 0,
   168                         nframes * driver->playback_sample_bytes);
   170         alsa_driver_mark_channel_done (driver,chn);
   174 alsa_driver_silence_on_channel_no_mark (
alsa_driver_t *driver, channel_t chn,
   175                                         jack_nframes_t nframes) {
   176         if (driver->playback_interleaved) {
   178                         (driver->playback_addr[chn],
   179                          0, nframes * driver->playback_sample_bytes,
   180                          driver->interleave_unit,
   181                          driver->playback_interleave_skip[chn]);
   183                 memset (driver->playback_addr[chn], 0,
   184                         nframes * driver->playback_sample_bytes);
   191                                jack_default_audio_sample_t *buf,
   192                                jack_nframes_t nsamples)
   194         driver->read_via_copy (buf,
   195                                driver->capture_addr[channel],
   197                                driver->capture_interleave_skip[channel]);
   203                               jack_default_audio_sample_t *buf,
   204                               jack_nframes_t nsamples)
   206         driver->write_via_copy (driver->playback_addr[channel],
   209                                 driver->playback_interleave_skip[channel],
   210                                 driver->dither_state+channel);
   211         alsa_driver_mark_channel_done (driver, channel);
   214 void  alsa_driver_silence_untouched_channels (
alsa_driver_t *driver,
   215                                               jack_nframes_t nframes);
   216 void  alsa_driver_set_clock_sync_status (
alsa_driver_t *driver, channel_t chn,
   217                                          ClockSyncStatus status);
   218 int   alsa_driver_listen_for_clock_sync_status (
alsa_driver_t *,
   219                                                 ClockSyncListenerFunction,
   221 int   alsa_driver_stop_listen_for_clock_sync_status (
alsa_driver_t *,
   223 void  alsa_driver_clock_sync_notify (
alsa_driver_t *, channel_t chn,
   228                               jack_nframes_t frames_per_cycle,
   229                               jack_nframes_t user_nperiods,
   230                               jack_nframes_t rate);
   233 alsa_driver_new (
char *name, 
char *playback_alsa_device,
   234                  char *capture_alsa_device,
   235                  jack_client_t *client,
   236                  jack_nframes_t frames_per_cycle,
   237                  jack_nframes_t user_nperiods,
   243                  DitherAlgorithm dither,
   246                  int user_capture_nchnls,
   247                  int user_playback_nchnls,
   249                  jack_nframes_t capture_latency,
   250                  jack_nframes_t playback_latency,
   263 alsa_driver_wait (
alsa_driver_t *driver, 
int extra_fd, 
int *status, 
float   267 alsa_driver_read (
alsa_driver_t *driver, jack_nframes_t nframes);
   270 alsa_driver_write (
alsa_driver_t* driver, jack_nframes_t nframes);
   272 jack_time_t jack_get_microseconds(
void);
   276 void ReadInput(jack_nframes_t orig_nframes, snd_pcm_sframes_t contiguous, snd_pcm_sframes_t nread);
   279 void WriteOutput(jack_nframes_t orig_nframes, snd_pcm_sframes_t contiguous, snd_pcm_sframes_t nwritten);
   280 void SetTime(jack_time_t time);