1 /* -*- mode: c; c-file-style: "linux"; -*- */
3 Copyright (C) 2001 Paul Davis
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #define __STDC_FORMAT_MACROS // For inttypes.h to work in C++
23 #define _GNU_SOURCE /* for strcasestr() from string.h */
33 #include <sys/types.h>
37 #include "alsa_driver.h"
38 #include "hammerfall.h"
44 #include "JackError.h"
46 #include "alsa_midi_impl.h"
48 extern void store_work_time (int);
49 extern void store_wait_time (int);
50 extern void show_wait_times ();
51 extern void show_work_times ();
55 char* strcasestr(const char* haystack
, const char* needle
);
57 /* Delay (in process calls) before jackd will report an xrun */
58 #define XRUN_REPORT_DELAY 0
59 /* Max re-try count for Alsa poll timeout handling */
60 #define MAX_RETRY_COUNT 5
63 jack_driver_init (jack_driver_t
*driver
)
65 memset (driver
, 0, sizeof (*driver
));
71 driver
->null_cycle
= 0;
78 jack_driver_nt_init (jack_driver_nt_t
* driver
)
80 memset (driver
, 0, sizeof (*driver
));
82 jack_driver_init ((jack_driver_t
*) driver
);
90 driver
->nt_bufsize
= 0;
93 driver
->nt_attach
= 0;
94 driver
->nt_detach
= 0;
95 driver
->nt_run_cycle
= 0;
99 alsa_driver_release_channel_dependent_memory (alsa_driver_t
*driver
)
101 bitset_destroy (&driver
->channels_done
);
102 bitset_destroy (&driver
->channels_not_done
);
104 if (driver
->playback_addr
) {
105 free (driver
->playback_addr
);
106 driver
->playback_addr
= 0;
109 if (driver
->capture_addr
) {
110 free (driver
->capture_addr
);
111 driver
->capture_addr
= 0;
114 if (driver
->playback_interleave_skip
) {
115 free (driver
->playback_interleave_skip
);
116 driver
->playback_interleave_skip
= NULL
;
119 if (driver
->capture_interleave_skip
) {
120 free (driver
->capture_interleave_skip
);
121 driver
->capture_interleave_skip
= NULL
;
124 if (driver
->silent
) {
125 free (driver
->silent
);
129 if (driver
->dither_state
) {
130 free (driver
->dither_state
);
131 driver
->dither_state
= 0;
136 alsa_driver_check_capabilities (alsa_driver_t
*driver
)
141 char* get_control_device_name(const char * device_name
);
144 alsa_driver_check_card_type (alsa_driver_t
*driver
)
147 snd_ctl_card_info_t
*card_info
;
150 snd_ctl_card_info_alloca (&card_info
);
152 ctl_name
= get_control_device_name(driver
->alsa_name_playback
);
154 // XXX: I don't know the "right" way to do this. Which to use
155 // driver->alsa_name_playback or driver->alsa_name_capture.
156 if ((err
= snd_ctl_open (&driver
->ctl_handle
, ctl_name
, 0)) < 0) {
157 jack_error ("control open \"%s\" (%s)", ctl_name
,
159 } else if ((err
= snd_ctl_card_info(driver
->ctl_handle
, card_info
)) < 0) {
160 jack_error ("control hardware info \"%s\" (%s)",
161 driver
->alsa_name_playback
, snd_strerror (err
));
162 snd_ctl_close (driver
->ctl_handle
);
165 driver
->alsa_driver
= strdup(snd_ctl_card_info_get_driver (card_info
));
169 return alsa_driver_check_capabilities (driver
);
173 alsa_driver_hammerfall_hardware (alsa_driver_t
*driver
)
175 driver
->hw
= jack_alsa_hammerfall_hw_new (driver
);
180 alsa_driver_hdsp_hardware (alsa_driver_t
*driver
)
182 driver
->hw
= jack_alsa_hdsp_hw_new (driver
);
187 alsa_driver_ice1712_hardware (alsa_driver_t
*driver
)
189 driver
->hw
= jack_alsa_ice1712_hw_new (driver
);
196 alsa_driver_usx2y_hardware (alsa_driver_t *driver)
198 driver->hw = jack_alsa_usx2y_hw_new (driver);
204 alsa_driver_generic_hardware (alsa_driver_t
*driver
)
206 driver
->hw
= jack_alsa_generic_hw_new (driver
);
211 alsa_driver_hw_specific (alsa_driver_t
*driver
, int hw_monitoring
,
216 if (!strcmp(driver
->alsa_driver
, "RME9652")) {
217 if ((err
= alsa_driver_hammerfall_hardware (driver
)) != 0) {
220 } else if (!strcmp(driver
->alsa_driver
, "H-DSP")) {
221 if ((err
= alsa_driver_hdsp_hardware (driver
)) !=0) {
224 } else if (!strcmp(driver
->alsa_driver
, "ICE1712")) {
225 if ((err
= alsa_driver_ice1712_hardware (driver
)) !=0) {
231 else if (!strcmp(driver->alsa_driver, "USB US-X2Y")) {
232 if ((err = alsa_driver_usx2y_hardware (driver)) !=0) {
238 if ((err
= alsa_driver_generic_hardware (driver
)) != 0) {
243 if (driver
->hw
->capabilities
& Cap_HardwareMonitoring
) {
244 driver
->has_hw_monitoring
= TRUE
;
245 /* XXX need to ensure that this is really FALSE or
247 driver
->hw_monitoring
= hw_monitoring
;
249 driver
->has_hw_monitoring
= FALSE
;
250 driver
->hw_monitoring
= FALSE
;
253 if (driver
->hw
->capabilities
& Cap_ClockLockReporting
) {
254 driver
->has_clock_sync_reporting
= TRUE
;
256 driver
->has_clock_sync_reporting
= FALSE
;
259 if (driver
->hw
->capabilities
& Cap_HardwareMetering
) {
260 driver
->has_hw_metering
= TRUE
;
261 driver
->hw_metering
= hw_metering
;
263 driver
->has_hw_metering
= FALSE
;
264 driver
->hw_metering
= FALSE
;
271 alsa_driver_setup_io_function_pointers (alsa_driver_t
*driver
)
273 if (driver
->playback_handle
) {
274 if (SND_PCM_FORMAT_FLOAT_LE
== driver
->playback_sample_format
) {
275 driver
->write_via_copy
= sample_move_dS_floatLE
;
277 switch (driver
->playback_sample_bytes
) {
279 switch (driver
->dither
) {
281 jack_info("Rectangular dithering at 16 bits");
282 driver
->write_via_copy
= driver
->quirk_bswap
?
283 sample_move_dither_rect_d16_sSs
:
284 sample_move_dither_rect_d16_sS
;
288 jack_info("Triangular dithering at 16 bits");
289 driver
->write_via_copy
= driver
->quirk_bswap
?
290 sample_move_dither_tri_d16_sSs
:
291 sample_move_dither_tri_d16_sS
;
295 jack_info("Noise-shaped dithering at 16 bits");
296 driver
->write_via_copy
= driver
->quirk_bswap
?
297 sample_move_dither_shaped_d16_sSs
:
298 sample_move_dither_shaped_d16_sS
;
302 driver
->write_via_copy
= driver
->quirk_bswap
?
303 sample_move_d16_sSs
:
309 case 3: /* NO DITHER */
310 driver
->write_via_copy
= driver
->quirk_bswap
?
316 case 4: /* NO DITHER */
317 switch (driver
->playback_sample_format
)
319 case SND_PCM_FORMAT_S24_LE
:
320 case SND_PCM_FORMAT_S24_BE
:
321 driver
->write_via_copy
= driver
->quirk_bswap
?
322 sample_move_d32l24_sSs
:
323 sample_move_d32l24_sS
;
325 case SND_PCM_FORMAT_S32_LE
:
326 case SND_PCM_FORMAT_S32_BE
:
328 int bits
= snd_pcm_hw_params_get_sbits(driver
->playback_hw_params
);
331 driver
->write_via_copy
= driver
->quirk_bswap
?
337 jack_log("sample format is SND_PCM_FORMAT_S32 but only 24 bits available");
338 driver
->write_via_copy
= driver
->quirk_bswap
?
339 sample_move_d32u24_sSs
:
340 sample_move_d32u24_sS
;
344 jack_error("unsupported sample format for playback: "
345 "SND_PCM_FORMAT_S32 with %d bits",
352 jack_error("unsupported 4 byte sample_format");
358 jack_error ("impossible sample width (%d) discovered!",
359 driver
->playback_sample_bytes
);
365 if (driver
->capture_handle
) {
366 if (SND_PCM_FORMAT_FLOAT_LE
== driver
->capture_sample_format
) {
367 driver
->read_via_copy
= sample_move_floatLE_sSs
;
369 switch (driver
->capture_sample_bytes
) {
371 driver
->read_via_copy
= driver
->quirk_bswap
?
376 driver
->read_via_copy
= driver
->quirk_bswap
?
381 switch (driver
->capture_sample_format
)
383 case SND_PCM_FORMAT_S24_LE
:
384 case SND_PCM_FORMAT_S24_BE
:
385 driver
->read_via_copy
= driver
->quirk_bswap
?
386 sample_move_dS_s32l24s
:
387 sample_move_dS_s32l24
;
389 case SND_PCM_FORMAT_S32_LE
:
390 case SND_PCM_FORMAT_S32_BE
:
392 int bits
= snd_pcm_hw_params_get_sbits(driver
->capture_hw_params
);
395 driver
->read_via_copy
= driver
->quirk_bswap
?
401 jack_log("sample format is SND_PCM_FORMAT_S32 but only 24 bits available");
402 driver
->read_via_copy
= driver
->quirk_bswap
?
403 sample_move_dS_s32u24s
:
404 sample_move_dS_s32u24
;
408 jack_error("unsupported sample format for capture: "
409 "SND_PCM_FORMAT_S32 with %d bits",
416 jack_error("unsupported 4 byte sample_format");
426 alsa_driver_configure_stream (alsa_driver_t
*driver
, char *device_name
,
427 const char *stream_name
,
429 snd_pcm_hw_params_t
*hw_params
,
430 snd_pcm_sw_params_t
*sw_params
,
431 unsigned int *nperiodsp
,
433 unsigned long sample_width
)
436 unsigned int frame_rate
;
437 snd_pcm_uframes_t stop_th
;
440 snd_pcm_format_t format
;
443 {"32bit float little-endian", SND_PCM_FORMAT_FLOAT_LE
, IS_LE
},
444 {"32bit integer little-endian", SND_PCM_FORMAT_S32_LE
, IS_LE
},
445 {"32bit integer big-endian", SND_PCM_FORMAT_S32_BE
, IS_BE
},
446 {"24bit little-endian in 3bytes format", SND_PCM_FORMAT_S24_3LE
, IS_LE
},
447 {"24bit big-endian in 3bytes format", SND_PCM_FORMAT_S24_3BE
, IS_BE
},
448 {"24bit little-endian", SND_PCM_FORMAT_S24_LE
, IS_LE
},
449 {"24bit big-endian", SND_PCM_FORMAT_S24_BE
, IS_BE
},
450 {"16bit little-endian", SND_PCM_FORMAT_S16_LE
, IS_LE
},
451 {"16bit big-endian", SND_PCM_FORMAT_S16_BE
, IS_BE
},
453 #define NUMFORMATS (sizeof(formats)/sizeof(formats[0]))
454 #define FIRST_16BIT_FORMAT 5
456 if ((err
= snd_pcm_hw_params_any (handle
, hw_params
)) < 0) {
457 jack_error ("ALSA: no playback configurations available (%s)",
462 if ((err
= snd_pcm_hw_params_set_periods_integer (handle
, hw_params
))
464 jack_error ("ALSA: cannot restrict period size to integral"
469 if ((err
= snd_pcm_hw_params_set_access (handle
, hw_params
, SND_PCM_ACCESS_MMAP_NONINTERLEAVED
)) < 0) {
470 if ((err
= snd_pcm_hw_params_set_access (handle
, hw_params
, SND_PCM_ACCESS_MMAP_INTERLEAVED
)) < 0) {
471 if ((err
= snd_pcm_hw_params_set_access (
473 SND_PCM_ACCESS_MMAP_COMPLEX
)) < 0) {
474 jack_error ("ALSA: mmap-based access is not possible"
476 "stream of this audio interface",
483 format
= (sample_width
== 4) ? 0 : NUMFORMATS
- 1;
486 if ((err
= snd_pcm_hw_params_set_format (
487 handle
, hw_params
, formats
[format
].format
)) < 0) {
489 if ((sample_width
== 4
490 ? format
++ >= NUMFORMATS
- 1
492 jack_error ("Sorry. The audio interface \"%s\""
493 " doesn't support any of the"
494 " hardware sample formats that"
495 " JACK's alsa-driver can use.",
500 if (formats
[format
].swapped
) {
501 driver
->quirk_bswap
= 1;
503 driver
->quirk_bswap
= 0;
505 jack_info ("ALSA: final selected sample format for %s: %s", stream_name
, formats
[format
].Name
);
510 frame_rate
= driver
->frame_rate
;
511 err
= snd_pcm_hw_params_set_rate_near (handle
, hw_params
,
513 driver
->frame_rate
= frame_rate
;
515 jack_error ("ALSA: cannot set sample/frame rate to %"
516 PRIu32
" for %s", driver
->frame_rate
,
521 /*if not user-specified, try to find the maximum
522 * number of channels */
523 unsigned int channels_max
;
524 err
= snd_pcm_hw_params_get_channels_max (hw_params
,
526 *nchns
= channels_max
;
530 /* the hapless user is an unwitting victim of
531 the "default" ALSA PCM device, which can
532 support up to 16 million channels. since
533 they can't be bothered to set up a proper
534 default device, limit the number of
535 channels for them to a sane default.
539 "You appear to be using the ALSA software \"plug\" layer, probably\n"
540 "a result of using the \"default\" ALSA device. This is less\n"
541 "efficient than it could be. Consider using a hardware device\n"
542 "instead rather than using the plug layer. Usually the name of the\n"
543 "hardware device that corresponds to the first sound card is hw:0\n"
549 if ((err
= snd_pcm_hw_params_set_channels (handle
, hw_params
,
551 jack_error ("ALSA: cannot set channel count to %u for %s",
552 *nchns
, stream_name
);
556 if ((err
= snd_pcm_hw_params_set_period_size (handle
, hw_params
,
557 driver
->frames_per_cycle
,
560 jack_error ("ALSA: cannot set period size to %" PRIu32
561 " frames for %s", driver
->frames_per_cycle
,
566 *nperiodsp
= driver
->user_nperiods
;
567 snd_pcm_hw_params_set_periods_min (handle
, hw_params
, nperiodsp
, NULL
);
568 if (*nperiodsp
< driver
->user_nperiods
)
569 *nperiodsp
= driver
->user_nperiods
;
570 if (snd_pcm_hw_params_set_periods_near (handle
, hw_params
,
571 nperiodsp
, NULL
) < 0) {
572 jack_error ("ALSA: cannot set number of periods to %u for %s",
573 *nperiodsp
, stream_name
);
577 if (*nperiodsp
< driver
->user_nperiods
) {
578 jack_error ("ALSA: got smaller periods %u than %u for %s",
579 *nperiodsp
, (unsigned int) driver
->user_nperiods
,
583 jack_info ("ALSA: use %d periods for %s", *nperiodsp
, stream_name
);
585 if (!jack_power_of_two(driver
->frames_per_cycle
)) {
586 jack_error("JACK: frames must be a power of two "
587 "(64, 512, 1024, ...)\n");
592 if ((err
= snd_pcm_hw_params_set_buffer_size (handle
, hw_params
,
594 driver
->frames_per_cycle
))
596 jack_error ("ALSA: cannot set buffer length to %" PRIu32
598 *nperiodsp
* driver
->frames_per_cycle
,
603 if ((err
= snd_pcm_hw_params (handle
, hw_params
)) < 0) {
604 jack_error ("ALSA: cannot set hardware parameters for %s",
609 snd_pcm_sw_params_current (handle
, sw_params
);
611 if ((err
= snd_pcm_sw_params_set_start_threshold (handle
, sw_params
,
613 jack_error ("ALSA: cannot set start mode for %s", stream_name
);
617 stop_th
= *nperiodsp
* driver
->frames_per_cycle
;
618 if (driver
->soft_mode
) {
619 stop_th
= (snd_pcm_uframes_t
)-1;
622 if ((err
= snd_pcm_sw_params_set_stop_threshold (
623 handle
, sw_params
, stop_th
)) < 0) {
624 jack_error ("ALSA: cannot set stop mode for %s",
629 if ((err
= snd_pcm_sw_params_set_silence_threshold (
630 handle
, sw_params
, 0)) < 0) {
631 jack_error ("ALSA: cannot set silence threshold for %s",
637 jack_info ("set silence size to %lu * %lu = %lu",
638 driver
->frames_per_cycle
, *nperiodsp
,
639 driver
->frames_per_cycle
* *nperiodsp
);
641 if ((err
= snd_pcm_sw_params_set_silence_size (
643 driver
->frames_per_cycle
* *nperiodsp
)) < 0) {
644 jack_error ("ALSA: cannot set silence size for %s",
650 if (handle
== driver
->playback_handle
)
651 err
= snd_pcm_sw_params_set_avail_min (
653 driver
->frames_per_cycle
654 * (*nperiodsp
- driver
->user_nperiods
+ 1));
656 err
= snd_pcm_sw_params_set_avail_min (
657 handle
, sw_params
, driver
->frames_per_cycle
);
660 jack_error ("ALSA: cannot set avail min for %s", stream_name
);
664 err
= snd_pcm_sw_params_set_tstamp_mode(handle
, sw_params
, SND_PCM_TSTAMP_ENABLE
);
666 jack_info("Could not enable ALSA time stamp mode for %s (err %d)",
670 #if SND_LIB_MAJOR >= 1 && SND_LIB_MINOR >= 1
671 err
= snd_pcm_sw_params_set_tstamp_type(handle
, sw_params
, SND_PCM_TSTAMP_TYPE_MONOTONIC
);
673 jack_info("Could not use monotonic ALSA time stamps for %s (err %d)",
678 if ((err
= snd_pcm_sw_params (handle
, sw_params
)) < 0) {
679 jack_error ("ALSA: cannot set software parameters for %s\n",
688 alsa_driver_set_parameters (alsa_driver_t
*driver
,
689 jack_nframes_t frames_per_cycle
,
690 jack_nframes_t user_nperiods
,
694 snd_pcm_uframes_t p_period_size
= 0;
695 snd_pcm_uframes_t c_period_size
= 0;
701 driver
->frame_rate
= rate
;
702 driver
->frames_per_cycle
= frames_per_cycle
;
703 driver
->user_nperiods
= user_nperiods
;
705 jack_info ("configuring for %" PRIu32
"Hz, period = %"
706 PRIu32
" frames (%.1f ms), buffer = %" PRIu32
" periods",
707 rate
, frames_per_cycle
, (((float)frames_per_cycle
/ (float) rate
) * 1000.0f
), user_nperiods
);
709 if (driver
->capture_handle
) {
710 if (alsa_driver_configure_stream (
712 driver
->alsa_name_capture
,
714 driver
->capture_handle
,
715 driver
->capture_hw_params
,
716 driver
->capture_sw_params
,
717 &driver
->capture_nperiods
,
718 &driver
->capture_nchannels
,
719 driver
->capture_sample_bytes
)) {
720 jack_error ("ALSA: cannot configure capture channel");
725 if (driver
->playback_handle
) {
726 if (alsa_driver_configure_stream (
728 driver
->alsa_name_playback
,
730 driver
->playback_handle
,
731 driver
->playback_hw_params
,
732 driver
->playback_sw_params
,
733 &driver
->playback_nperiods
,
734 &driver
->playback_nchannels
,
735 driver
->playback_sample_bytes
)) {
736 jack_error ("ALSA: cannot configure playback channel");
741 /* check the rate, since that's rather important */
743 if (driver
->playback_handle
) {
744 snd_pcm_hw_params_get_rate (driver
->playback_hw_params
,
748 if (driver
->capture_handle
) {
749 snd_pcm_hw_params_get_rate (driver
->capture_hw_params
,
753 if (driver
->capture_handle
&& driver
->playback_handle
) {
755 jack_error ("playback and capture sample rates do "
756 "not match (%d vs. %d)", pr
, cr
);
759 /* only change if *both* capture and playback rates
760 * don't match requested certain hardware actually
761 * still works properly in full-duplex with slightly
762 * different rate values between adc and dac
764 if (cr
!= driver
->frame_rate
&& pr
!= driver
->frame_rate
) {
765 jack_error ("sample rate in use (%d Hz) does not "
766 "match requested rate (%d Hz)",
767 cr
, driver
->frame_rate
);
768 driver
->frame_rate
= cr
;
772 else if (driver
->capture_handle
&& cr
!= driver
->frame_rate
) {
773 jack_error ("capture sample rate in use (%d Hz) does not "
774 "match requested rate (%d Hz)",
775 cr
, driver
->frame_rate
);
776 driver
->frame_rate
= cr
;
778 else if (driver
->playback_handle
&& pr
!= driver
->frame_rate
) {
779 jack_error ("playback sample rate in use (%d Hz) does not "
780 "match requested rate (%d Hz)",
781 pr
, driver
->frame_rate
);
782 driver
->frame_rate
= pr
;
786 /* check the fragment size, since that's non-negotiable */
788 if (driver
->playback_handle
) {
789 snd_pcm_access_t access
;
791 err
= snd_pcm_hw_params_get_period_size (
792 driver
->playback_hw_params
, &p_period_size
, &dir
);
793 err
= snd_pcm_hw_params_get_format (
794 driver
->playback_hw_params
,
795 &(driver
->playback_sample_format
));
796 err
= snd_pcm_hw_params_get_access (driver
->playback_hw_params
,
798 driver
->playback_interleaved
=
799 (access
== SND_PCM_ACCESS_MMAP_INTERLEAVED
)
800 || (access
== SND_PCM_ACCESS_MMAP_COMPLEX
);
802 if (p_period_size
!= driver
->frames_per_cycle
) {
803 jack_error ("alsa_pcm: requested an interrupt every %"
805 " frames but got %u frames for playback",
806 driver
->frames_per_cycle
, p_period_size
);
811 if (driver
->capture_handle
) {
812 snd_pcm_access_t access
;
814 err
= snd_pcm_hw_params_get_period_size (
815 driver
->capture_hw_params
, &c_period_size
, &dir
);
816 err
= snd_pcm_hw_params_get_format (
817 driver
->capture_hw_params
,
818 &(driver
->capture_sample_format
));
819 err
= snd_pcm_hw_params_get_access (driver
->capture_hw_params
,
821 driver
->capture_interleaved
=
822 (access
== SND_PCM_ACCESS_MMAP_INTERLEAVED
)
823 || (access
== SND_PCM_ACCESS_MMAP_COMPLEX
);
825 if (c_period_size
!= driver
->frames_per_cycle
) {
826 jack_error ("alsa_pcm: requested an interrupt every %"
828 " frames but got %u frames for capture",
829 driver
->frames_per_cycle
, c_period_size
);
834 driver
->playback_sample_bytes
=
835 snd_pcm_format_physical_width (driver
->playback_sample_format
)
837 driver
->capture_sample_bytes
=
838 snd_pcm_format_physical_width (driver
->capture_sample_format
)
841 if (driver
->playback_handle
) {
842 switch (driver
->playback_sample_format
) {
843 case SND_PCM_FORMAT_FLOAT_LE
:
844 case SND_PCM_FORMAT_S32_LE
:
845 case SND_PCM_FORMAT_S24_3LE
:
846 case SND_PCM_FORMAT_S24_3BE
:
847 case SND_PCM_FORMAT_S24_LE
:
848 case SND_PCM_FORMAT_S24_BE
:
849 case SND_PCM_FORMAT_S16_LE
:
850 case SND_PCM_FORMAT_S32_BE
:
851 case SND_PCM_FORMAT_S16_BE
:
855 jack_error ("programming error: unhandled format "
856 "type for playback");
861 if (driver
->capture_handle
) {
862 switch (driver
->capture_sample_format
) {
863 case SND_PCM_FORMAT_FLOAT_LE
:
864 case SND_PCM_FORMAT_S32_LE
:
865 case SND_PCM_FORMAT_S24_3LE
:
866 case SND_PCM_FORMAT_S24_3BE
:
867 case SND_PCM_FORMAT_S24_LE
:
868 case SND_PCM_FORMAT_S24_BE
:
869 case SND_PCM_FORMAT_S16_LE
:
870 case SND_PCM_FORMAT_S32_BE
:
871 case SND_PCM_FORMAT_S16_BE
:
875 jack_error ("programming error: unhandled format "
881 if (driver
->playback_interleaved
) {
882 const snd_pcm_channel_area_t
*my_areas
;
883 snd_pcm_uframes_t offset
, frames
;
884 if (snd_pcm_mmap_begin(driver
->playback_handle
,
885 &my_areas
, &offset
, &frames
) < 0) {
886 jack_error ("ALSA: %s: mmap areas info error",
887 driver
->alsa_name_playback
);
890 driver
->interleave_unit
=
891 snd_pcm_format_physical_width (
892 driver
->playback_sample_format
) / 8;
894 driver
->interleave_unit
= 0; /* NOT USED */
897 if (driver
->capture_interleaved
) {
898 const snd_pcm_channel_area_t
*my_areas
;
899 snd_pcm_uframes_t offset
, frames
;
900 if (snd_pcm_mmap_begin(driver
->capture_handle
,
901 &my_areas
, &offset
, &frames
) < 0) {
902 jack_error ("ALSA: %s: mmap areas info error",
903 driver
->alsa_name_capture
);
908 if (driver
->playback_nchannels
> driver
->capture_nchannels
) {
909 driver
->max_nchannels
= driver
->playback_nchannels
;
911 driver
->max_nchannels
= driver
->capture_nchannels
;
914 alsa_driver_setup_io_function_pointers (driver
);
916 /* Allocate and initialize structures that rely on the
919 Set up the bit pattern that is used to record which
920 channels require action on every cycle. any bits that are
921 not set after the engine's process() call indicate channels
922 that potentially need to be silenced.
925 bitset_create (&driver
->channels_done
, driver
->max_nchannels
);
926 bitset_create (&driver
->channels_not_done
, driver
->max_nchannels
);
928 if (driver
->playback_handle
) {
929 driver
->playback_addr
= (char **)
930 malloc (sizeof (char *) * driver
->playback_nchannels
);
931 memset (driver
->playback_addr
, 0,
932 sizeof (char *) * driver
->playback_nchannels
);
933 driver
->playback_interleave_skip
= (unsigned long *)
934 malloc (sizeof (unsigned long *) * driver
->playback_nchannels
);
935 memset (driver
->playback_interleave_skip
, 0,
936 sizeof (unsigned long *) * driver
->playback_nchannels
);
937 driver
->silent
= (unsigned long *)
938 malloc (sizeof (unsigned long)
939 * driver
->playback_nchannels
);
941 for (chn
= 0; chn
< driver
->playback_nchannels
; chn
++) {
942 driver
->silent
[chn
] = 0;
945 for (chn
= 0; chn
< driver
->playback_nchannels
; chn
++) {
946 bitset_add (driver
->channels_done
, chn
);
949 driver
->dither_state
= (dither_state_t
*)
950 calloc ( driver
->playback_nchannels
,
951 sizeof (dither_state_t
));
954 if (driver
->capture_handle
) {
955 driver
->capture_addr
= (char **)
956 malloc (sizeof (char *) * driver
->capture_nchannels
);
957 memset (driver
->capture_addr
, 0,
958 sizeof (char *) * driver
->capture_nchannels
);
959 driver
->capture_interleave_skip
= (unsigned long *)
960 malloc (sizeof (unsigned long *) * driver
->capture_nchannels
);
961 memset (driver
->capture_interleave_skip
, 0,
962 sizeof (unsigned long *) * driver
->capture_nchannels
);
965 driver
->clock_sync_data
= (ClockSyncStatus
*)
966 malloc (sizeof (ClockSyncStatus
) * driver
->max_nchannels
);
968 driver
->period_usecs
=
969 (jack_time_t
) floor ((((float) driver
->frames_per_cycle
) /
970 driver
->frame_rate
) * 1000000.0f
);
971 driver
->poll_timeout
= (int) floor (1.5f
* driver
->period_usecs
);
975 if (driver->engine) {
976 if (driver->engine->set_buffer_size (driver->engine,
977 driver->frames_per_cycle)) {
978 jack_error ("ALSA: Cannot set engine buffer size to %d (check MIDI)", driver->frames_per_cycle);
991 alsa_driver_reset_parameters (alsa_driver_t
*driver
,
992 jack_nframes_t frames_per_cycle
,
993 jack_nframes_t user_nperiods
,
996 /* XXX unregister old ports ? */
997 alsa_driver_release_channel_dependent_memory (driver
);
998 return alsa_driver_set_parameters (driver
,
1000 user_nperiods
, rate
);
1004 alsa_driver_get_channel_addresses (alsa_driver_t
*driver
,
1005 snd_pcm_uframes_t
*capture_avail
,
1006 snd_pcm_uframes_t
*playback_avail
,
1007 snd_pcm_uframes_t
*capture_offset
,
1008 snd_pcm_uframes_t
*playback_offset
)
1013 if (capture_avail
) {
1014 if ((err
= snd_pcm_mmap_begin (
1015 driver
->capture_handle
, &driver
->capture_areas
,
1016 (snd_pcm_uframes_t
*) capture_offset
,
1017 (snd_pcm_uframes_t
*) capture_avail
)) < 0) {
1018 jack_error ("ALSA: %s: mmap areas info error",
1019 driver
->alsa_name_capture
);
1023 for (chn
= 0; chn
< driver
->capture_nchannels
; chn
++) {
1024 const snd_pcm_channel_area_t
*a
=
1025 &driver
->capture_areas
[chn
];
1026 driver
->capture_addr
[chn
] = (char *) a
->addr
1027 + ((a
->first
+ a
->step
* *capture_offset
) / 8);
1028 driver
->capture_interleave_skip
[chn
] = (unsigned long ) (a
->step
/ 8);
1032 if (playback_avail
) {
1033 if ((err
= snd_pcm_mmap_begin (
1034 driver
->playback_handle
, &driver
->playback_areas
,
1035 (snd_pcm_uframes_t
*) playback_offset
,
1036 (snd_pcm_uframes_t
*) playback_avail
)) < 0) {
1037 jack_error ("ALSA: %s: mmap areas info error ",
1038 driver
->alsa_name_playback
);
1042 for (chn
= 0; chn
< driver
->playback_nchannels
; chn
++) {
1043 const snd_pcm_channel_area_t
*a
=
1044 &driver
->playback_areas
[chn
];
1045 driver
->playback_addr
[chn
] = (char *) a
->addr
1046 + ((a
->first
+ a
->step
* *playback_offset
) / 8);
1047 driver
->playback_interleave_skip
[chn
] = (unsigned long ) (a
->step
/ 8);
1055 alsa_driver_start (alsa_driver_t
*driver
)
1058 snd_pcm_uframes_t poffset
, pavail
;
1061 driver
->poll_last
= 0;
1062 driver
->poll_next
= 0;
1064 if (driver
->playback_handle
) {
1065 if ((err
= snd_pcm_prepare (driver
->playback_handle
)) < 0) {
1066 jack_error ("ALSA: prepare error for playback on "
1067 "\"%s\" (%s)", driver
->alsa_name_playback
,
1073 if ((driver
->capture_handle
&& driver
->capture_and_playback_not_synced
)
1074 || !driver
->playback_handle
) {
1075 if ((err
= snd_pcm_prepare (driver
->capture_handle
)) < 0) {
1076 jack_error ("ALSA: prepare error for capture on \"%s\""
1077 " (%s)", driver
->alsa_name_capture
,
1083 if (driver
->hw_monitoring
) {
1084 if (driver
->input_monitor_mask
|| driver
->all_monitor_in
) {
1085 if (driver
->all_monitor_in
) {
1086 driver
->hw
->set_input_monitor_mask (driver
->hw
, ~0U);
1088 driver
->hw
->set_input_monitor_mask (
1089 driver
->hw
, driver
->input_monitor_mask
);
1092 driver
->hw
->set_input_monitor_mask (driver
->hw
,
1093 driver
->input_monitor_mask
);
1097 if (driver
->playback_handle
) {
1098 driver
->playback_nfds
=
1099 snd_pcm_poll_descriptors_count (driver
->playback_handle
);
1101 driver
->playback_nfds
= 0;
1104 if (driver
->capture_handle
) {
1105 driver
->capture_nfds
=
1106 snd_pcm_poll_descriptors_count (driver
->capture_handle
);
1108 driver
->capture_nfds
= 0;
1115 driver
->pfd
= (struct pollfd
*)
1116 malloc (sizeof (struct pollfd
) *
1117 (driver
->playback_nfds
+ driver
->capture_nfds
+ 2));
1119 if (driver
->midi
&& !driver
->xrun_recovery
)
1120 (driver
->midi
->start
)(driver
->midi
);
1122 if (driver
->playback_handle
) {
1123 /* fill playback buffer with zeroes, and mark
1124 all fragments as having data.
1127 pavail
= snd_pcm_avail_update (driver
->playback_handle
);
1130 driver
->frames_per_cycle
* driver
->playback_nperiods
) {
1131 jack_error ("ALSA: full buffer not available at start");
1135 if (alsa_driver_get_channel_addresses (driver
,
1136 0, &pavail
, 0, &poffset
)) {
1140 /* XXX this is cheating. ALSA offers no guarantee that
1141 we can access the entire buffer at any one time. It
1142 works on most hardware tested so far, however, buts
1143 its a liability in the long run. I think that
1144 alsa-lib may have a better function for doing this
1145 here, where the goal is to silence the entire
1149 for (chn
= 0; chn
< driver
->playback_nchannels
; chn
++) {
1150 alsa_driver_silence_on_channel (
1152 driver
->user_nperiods
1153 * driver
->frames_per_cycle
);
1156 snd_pcm_mmap_commit (driver
->playback_handle
, poffset
,
1157 driver
->user_nperiods
1158 * driver
->frames_per_cycle
);
1160 if ((err
= snd_pcm_start (driver
->playback_handle
)) < 0) {
1161 jack_error ("ALSA: could not start playback (%s)",
1162 snd_strerror (err
));
1167 if ((driver
->capture_handle
&& driver
->capture_and_playback_not_synced
)
1168 || !driver
->playback_handle
) {
1169 if ((err
= snd_pcm_start (driver
->capture_handle
)) < 0) {
1170 jack_error ("ALSA: could not start capture (%s)",
1171 snd_strerror (err
));
1180 alsa_driver_stop (alsa_driver_t
*driver
)
1186 /* silence all capture port buffers, because we might
1187 be entering offline mode.
1192 for (chn = 0, node = driver->capture_ports; node;
1193 node = jack_slist_next (node), chn++) {
1197 jack_nframes_t nframes = driver->engine->control->buffer_size;
1199 port = (jack_port_t *) node->data;
1200 buf = jack_port_get_buffer (port, nframes);
1201 memset (buf, 0, sizeof (jack_default_audio_sample_t) * nframes);
1208 if (driver
->playback_handle
) {
1209 if ((err
= snd_pcm_drop (driver
->playback_handle
)) < 0) {
1210 jack_error ("ALSA: channel flush for playback "
1211 "failed (%s)", snd_strerror (err
));
1216 if (!driver
->playback_handle
1217 || driver
->capture_and_playback_not_synced
) {
1218 if (driver
->capture_handle
) {
1219 if ((err
= snd_pcm_drop (driver
->capture_handle
)) < 0) {
1220 jack_error ("ALSA: channel flush for "
1221 "capture failed (%s)",
1222 snd_strerror (err
));
1228 if (driver
->hw_monitoring
) {
1229 driver
->hw
->set_input_monitor_mask (driver
->hw
, 0);
1232 if (driver
->midi
&& !driver
->xrun_recovery
)
1233 (driver
->midi
->stop
)(driver
->midi
);
1239 alsa_driver_restart (alsa_driver_t
*driver
)
1243 driver
->xrun_recovery
= 1;
1246 if ((res = driver->nt_stop((struct _jack_driver_nt *) driver))==0)
1247 res = driver->nt_start((struct _jack_driver_nt *) driver);
1250 driver
->xrun_recovery
= 0;
1252 if (res
&& driver
->midi
)
1253 (driver
->midi
->stop
)(driver
->midi
);
1259 alsa_driver_xrun_recovery (alsa_driver_t
*driver
, float *delayed_usecs
)
1261 snd_pcm_status_t
*status
;
1264 snd_pcm_status_alloca(&status
);
1266 if (driver
->capture_handle
) {
1267 if ((res
= snd_pcm_status(driver
->capture_handle
, status
))
1269 jack_error("status error: %s", snd_strerror(res
));
1272 if ((res
= snd_pcm_status(driver
->playback_handle
, status
))
1274 jack_error("status error: %s", snd_strerror(res
));
1278 if (snd_pcm_status_get_state(status
) == SND_PCM_STATE_SUSPENDED
)
1280 jack_log("**** alsa_pcm: pcm in suspended state, resuming it" );
1281 if (driver
->capture_handle
) {
1282 if ((res
= snd_pcm_prepare(driver
->capture_handle
))
1284 jack_error("error preparing after suspend: %s", snd_strerror(res
));
1287 if (driver
->playback_handle
) {
1288 if ((res
= snd_pcm_prepare(driver
->playback_handle
))
1290 jack_error("error preparing after suspend: %s", snd_strerror(res
));
1295 if (snd_pcm_status_get_state(status
) == SND_PCM_STATE_XRUN
1296 && driver
->process_count
> XRUN_REPORT_DELAY
) {
1297 struct timeval now
, diff
, tstamp
;
1298 driver
->xrun_count
++;
1299 snd_pcm_status_get_tstamp(status
,&now
);
1300 snd_pcm_status_get_trigger_tstamp(status
, &tstamp
);
1301 timersub(&now
, &tstamp
, &diff
);
1302 *delayed_usecs
= diff
.tv_sec
* 1000000.0 + diff
.tv_usec
;
1303 jack_log("**** alsa_pcm: xrun of at least %.3f msecs",*delayed_usecs
/ 1000.0);
1304 if (driver
->capture_handle
) {
1305 jack_log("Repreparing capture");
1306 if ((res
= snd_pcm_prepare(driver
->capture_handle
)) < 0) {
1307 jack_error("error preparing after xrun: %s", snd_strerror(res
));
1310 if (driver
->playback_handle
) {
1311 jack_log("Repreparing playback");
1312 if ((res
= snd_pcm_prepare(driver
->playback_handle
)) < 0) {
1313 jack_error("error preparing after xrun: %s", snd_strerror(res
));
1318 if (alsa_driver_restart (driver
)) {
1325 alsa_driver_silence_untouched_channels (alsa_driver_t
*driver
,
1326 jack_nframes_t nframes
)
1329 jack_nframes_t buffer_frames
=
1330 driver
->frames_per_cycle
* driver
->playback_nperiods
;
1332 for (chn
= 0; chn
< driver
->playback_nchannels
; chn
++) {
1333 if (bitset_contains (driver
->channels_not_done
, chn
)) {
1334 if (driver
->silent
[chn
] < buffer_frames
) {
1335 alsa_driver_silence_on_channel_no_mark (
1336 driver
, chn
, nframes
);
1337 driver
->silent
[chn
] += nframes
;
1344 alsa_driver_set_clock_sync_status (alsa_driver_t
*driver
, channel_t chn
,
1345 ClockSyncStatus status
)
1347 driver
->clock_sync_data
[chn
] = status
;
1348 alsa_driver_clock_sync_notify (driver
, chn
, status
);
1351 static int under_gdb
= FALSE
;
1354 alsa_driver_wait (alsa_driver_t
*driver
, int extra_fd
, int *status
, float
1357 snd_pcm_sframes_t avail
= 0;
1358 snd_pcm_sframes_t capture_avail
= 0;
1359 snd_pcm_sframes_t playback_avail
= 0;
1360 int xrun_detected
= FALSE
;
1365 jack_time_t poll_enter
;
1366 jack_time_t poll_ret
= 0;
1371 need_capture
= driver
->capture_handle
? 1 : 0;
1373 if (extra_fd
>= 0) {
1376 need_playback
= driver
->playback_handle
? 1 : 0;
1381 while ((need_playback
|| need_capture
) && !xrun_detected
) {
1384 unsigned int ci
= 0;
1386 unsigned short revents
;
1390 if (need_playback
) {
1391 snd_pcm_poll_descriptors (driver
->playback_handle
,
1393 driver
->playback_nfds
);
1394 nfds
+= driver
->playback_nfds
;
1398 snd_pcm_poll_descriptors (driver
->capture_handle
,
1400 driver
->capture_nfds
);
1402 nfds
+= driver
->capture_nfds
;
1405 /* ALSA doesn't set POLLERR in some versions of 0.9.X */
1407 for (i
= 0; i
< nfds
; i
++) {
1408 driver
->pfd
[i
].events
|= POLLERR
;
1411 if (extra_fd
>= 0) {
1412 driver
->pfd
[nfds
].fd
= extra_fd
;
1413 driver
->pfd
[nfds
].events
=
1414 POLLIN
|POLLERR
|POLLHUP
|POLLNVAL
;
1418 poll_enter
= jack_get_microseconds ();
1420 if (poll_enter
> driver
->poll_next
) {
1422 * This processing cycle was delayed past the
1423 * next due interrupt! Do not account this as
1426 driver
->poll_next
= 0;
1427 driver
->poll_late
++;
1431 poll_result
= poll (driver
->pfd
, nfds
, -1); //fix for sleep issue
1433 poll_result
= poll (driver
->pfd
, nfds
, driver
->poll_timeout
);
1435 if (poll_result
< 0) {
1437 if (errno
== EINTR
) {
1438 const char poll_log
[] = "ALSA: poll interrupt";
1439 // this happens mostly when run
1440 // under gdb, or when exiting due to a signal
1442 jack_info(poll_log
);
1445 jack_error(poll_log
);
1450 jack_error ("ALSA: poll call failed (%s)",
1457 poll_ret
= jack_get_microseconds ();
1459 if (poll_result
== 0) {
1461 if(retry_cnt
> MAX_RETRY_COUNT
) {
1462 jack_error ("ALSA: poll time out, polled for %" PRIu64
1463 " usecs, Reached max retry cnt = %d, Exiting",
1464 poll_ret
- poll_enter
, MAX_RETRY_COUNT
);
1468 jack_error ("ALSA: poll time out, polled for %" PRIu64
1469 " usecs, Retrying with a recovery, retry cnt = %d",
1470 poll_ret
- poll_enter
, retry_cnt
);
1471 *status
= alsa_driver_xrun_recovery (driver
, delayed_usecs
);
1473 jack_error ("ALSA: poll time out, recovery failed with status = %d", *status
);
1482 if (driver
->poll_next
&& poll_ret
> driver
->poll_next
) {
1483 *delayed_usecs
= poll_ret
- driver
->poll_next
;
1485 driver
->poll_last
= poll_ret
;
1486 driver
->poll_next
= poll_ret
+ driver
->period_usecs
;
1489 driver->engine->transport_cycle_start (driver->engine,
1495 fprintf (stderr
, "%" PRIu64
": checked %d fds, started at %" PRIu64
" %" PRIu64
" usecs since poll entered\n",
1496 poll_ret
, nfds
, poll_enter
, poll_ret
- poll_enter
);
1499 /* check to see if it was the extra FD that caused us
1500 * to return from poll */
1502 if (extra_fd
>= 0) {
1504 if (driver
->pfd
[nfds
-1].revents
== 0) {
1505 /* we timed out on the extra fd */
1511 /* if POLLIN was the only bit set, we're OK */
1514 return (driver
->pfd
[nfds
-1].revents
== POLLIN
) ? 0 : -1;
1517 if (need_playback
) {
1518 if (snd_pcm_poll_descriptors_revents
1519 (driver
->playback_handle
, &driver
->pfd
[0],
1520 driver
->playback_nfds
, &revents
) < 0) {
1521 jack_error ("ALSA: playback revents failed");
1526 if (revents
& POLLNVAL
) {
1527 jack_error ("ALSA: playback device disconnected");
1532 if (revents
& POLLERR
) {
1533 xrun_detected
= TRUE
;
1536 if (revents
& POLLOUT
) {
1539 fprintf (stderr
, "%" PRIu64
1540 " playback stream ready\n",
1547 if (snd_pcm_poll_descriptors_revents
1548 (driver
->capture_handle
, &driver
->pfd
[ci
],
1549 driver
->capture_nfds
, &revents
) < 0) {
1550 jack_error ("ALSA: capture revents failed");
1555 if (revents
& POLLNVAL
) {
1556 jack_error ("ALSA: capture device disconnected");
1561 if (revents
& POLLERR
) {
1562 xrun_detected
= TRUE
;
1565 if (revents
& POLLIN
) {
1568 fprintf (stderr
, "%" PRIu64
1569 " capture stream ready\n",
1576 if (driver
->capture_handle
) {
1577 if ((capture_avail
= snd_pcm_avail_update (
1578 driver
->capture_handle
)) < 0) {
1579 if (capture_avail
== -EPIPE
) {
1580 xrun_detected
= TRUE
;
1582 jack_error ("unknown ALSA avail_update return"
1583 " value (%u)", capture_avail
);
1587 /* odd, but see min() computation below */
1588 capture_avail
= INT_MAX
;
1591 if (driver
->playback_handle
) {
1592 if ((playback_avail
= snd_pcm_avail_update (
1593 driver
->playback_handle
)) < 0) {
1594 if (playback_avail
== -EPIPE
) {
1595 xrun_detected
= TRUE
;
1597 jack_error ("unknown ALSA avail_update return"
1598 " value (%u)", playback_avail
);
1602 /* odd, but see min() computation below */
1603 playback_avail
= INT_MAX
;
1606 if (xrun_detected
) {
1607 *status
= alsa_driver_xrun_recovery (driver
, delayed_usecs
);
1612 driver
->last_wait_ust
= poll_ret
;
1614 avail
= capture_avail
< playback_avail
? capture_avail
: playback_avail
;
1617 fprintf (stderr
, "wakeup complete, avail = %lu, pavail = %lu "
1619 avail
, playback_avail
, capture_avail
);
1622 /* mark all channels not done for now. read/write will change this */
1624 bitset_copy (driver
->channels_not_done
, driver
->channels_done
);
1626 /* constrain the available count to the nearest (round down) number of
1630 return avail
- (avail
% driver
->frames_per_cycle
);
1635 alsa_driver_read (alsa_driver_t
*driver
, jack_nframes_t nframes
)
1637 snd_pcm_sframes_t contiguous
;
1638 snd_pcm_sframes_t nread
;
1639 snd_pcm_uframes_t offset
;
1640 jack_nframes_t orig_nframes
;
1641 // jack_default_audio_sample_t* buf;
1644 // jack_port_t* port;
1647 if (nframes
> driver
->frames_per_cycle
) {
1653 if (driver->engine->freewheeling) {
1658 (driver
->midi
->read
)(driver
->midi
, nframes
);
1660 if (!driver
->capture_handle
) {
1666 orig_nframes
= nframes
;
1670 contiguous
= nframes
;
1672 if (alsa_driver_get_channel_addresses (
1674 (snd_pcm_uframes_t
*) &contiguous
,
1675 (snd_pcm_uframes_t
*) 0,
1681 for (chn = 0, node = driver->capture_ports; node;
1682 node = jack_slist_next (node), chn++) {
1684 port = (jack_port_t *) node->data;
1686 if (!jack_port_connected (port)) {
1687 // no-copy optimization
1690 buf = jack_port_get_buffer (port, orig_nframes);
1691 alsa_driver_read_from_channel (driver, chn,
1692 buf + nread, contiguous);
1695 ReadInput(orig_nframes
, contiguous
, nread
);
1697 if ((err
= snd_pcm_mmap_commit (driver
->capture_handle
,
1698 offset
, contiguous
)) < 0) {
1699 jack_error ("ALSA: could not complete read of %"
1700 PRIu32
" frames: error = %d", contiguous
, err
);
1704 nframes
-= contiguous
;
1705 nread
+= contiguous
;
1712 alsa_driver_write (alsa_driver_t
* driver
, jack_nframes_t nframes
)
1716 // JSList *mon_node;
1717 // jack_default_audio_sample_t* buf;
1718 // jack_default_audio_sample_t* monbuf;
1719 jack_nframes_t orig_nframes
;
1720 snd_pcm_sframes_t nwritten
;
1721 snd_pcm_sframes_t contiguous
;
1722 snd_pcm_uframes_t offset
;
1723 // jack_port_t *port;
1726 driver
->process_count
++;
1730 if (!driver->playback_handle || driver->engine->freewheeling) {
1734 if (!driver
->playback_handle
) {
1738 if (nframes
> driver
->frames_per_cycle
) {
1743 (driver
->midi
->write
)(driver
->midi
, nframes
);
1747 orig_nframes
= nframes
;
1749 /* check current input monitor request status */
1751 driver
->input_monitor_mask
= 0;
1755 for (chn = 0, node = driver->capture_ports; node;
1756 node = jack_slist_next (node), chn++) {
1757 if (((jack_port_t *) node->data)->shared->monitor_requests) {
1758 driver->input_monitor_mask |= (1<<chn);
1764 if (driver
->hw_monitoring
) {
1765 if ((driver
->hw
->input_monitor_mask
1766 != driver
->input_monitor_mask
)
1767 && !driver
->all_monitor_in
) {
1768 driver
->hw
->set_input_monitor_mask (
1769 driver
->hw
, driver
->input_monitor_mask
);
1775 contiguous
= nframes
;
1777 if (alsa_driver_get_channel_addresses (
1779 (snd_pcm_uframes_t
*) 0,
1780 (snd_pcm_uframes_t
*) &contiguous
,
1787 for (chn = 0, node = driver->playback_ports, mon_node=driver->monitor_ports;
1789 node = jack_slist_next (node), chn++) {
1791 port = (jack_port_t *) node->data;
1793 if (!jack_port_connected (port)) {
1796 buf = jack_port_get_buffer (port, orig_nframes);
1797 alsa_driver_write_to_channel (driver, chn,
1798 buf + nwritten, contiguous);
1801 port = (jack_port_t *) mon_node->data;
1802 if (!jack_port_connected (port)) {
1805 monbuf = jack_port_get_buffer (port, orig_nframes);
1806 memcpy (monbuf + nwritten, buf + nwritten, contiguous * sizeof(jack_default_audio_sample_t));
1807 mon_node = jack_slist_next (mon_node);
1813 WriteOutput(orig_nframes
, contiguous
, nwritten
);
1815 if (!bitset_empty (driver
->channels_not_done
)) {
1816 alsa_driver_silence_untouched_channels (driver
,
1820 if ((err
= snd_pcm_mmap_commit (driver
->playback_handle
,
1821 offset
, contiguous
)) < 0) {
1822 jack_error ("ALSA: could not complete playback of %"
1823 PRIu32
" frames: error = %d", contiguous
, err
);
1824 if (err
!= -EPIPE
&& err
!= -ESTRPIPE
)
1828 nframes
-= contiguous
;
1829 nwritten
+= contiguous
;
1836 static int /* UNUSED */
1837 alsa_driver_change_sample_clock (alsa_driver_t
*driver
, SampleClockMode mode
)
1839 return driver
->hw
->change_sample_clock (driver
->hw
, mode
);
1842 static void /* UNUSED */
1843 alsa_driver_request_all_monitor_input (alsa_driver_t
*driver
, int yn
)
1846 if (driver
->hw_monitoring
) {
1848 driver
->hw
->set_input_monitor_mask (driver
->hw
, ~0U);
1850 driver
->hw
->set_input_monitor_mask (
1851 driver
->hw
, driver
->input_monitor_mask
);
1855 driver
->all_monitor_in
= yn
;
1858 static void /* UNUSED */
1859 alsa_driver_set_hw_monitoring (alsa_driver_t
*driver
, int yn
)
1862 driver
->hw_monitoring
= TRUE
;
1864 if (driver
->all_monitor_in
) {
1865 driver
->hw
->set_input_monitor_mask (driver
->hw
, ~0U);
1867 driver
->hw
->set_input_monitor_mask (
1868 driver
->hw
, driver
->input_monitor_mask
);
1871 driver
->hw_monitoring
= FALSE
;
1872 driver
->hw
->set_input_monitor_mask (driver
->hw
, 0);
1876 static ClockSyncStatus
/* UNUSED */
1877 alsa_driver_clock_sync_status (channel_t chn
)
1884 alsa_driver_delete (alsa_driver_t
*driver
)
1889 (driver
->midi
->destroy
)(driver
->midi
);
1891 for (node
= driver
->clock_sync_listeners
; node
;
1892 node
= jack_slist_next (node
)) {
1895 jack_slist_free (driver
->clock_sync_listeners
);
1897 if (driver
->ctl_handle
) {
1898 snd_ctl_close (driver
->ctl_handle
);
1899 driver
->ctl_handle
= 0;
1902 if (driver
->capture_handle
) {
1903 snd_pcm_close (driver
->capture_handle
);
1904 driver
->capture_handle
= 0;
1907 if (driver
->playback_handle
) {
1908 snd_pcm_close (driver
->playback_handle
);
1909 driver
->capture_handle
= 0;
1912 if (driver
->capture_hw_params
) {
1913 snd_pcm_hw_params_free (driver
->capture_hw_params
);
1914 driver
->capture_hw_params
= 0;
1917 if (driver
->playback_hw_params
) {
1918 snd_pcm_hw_params_free (driver
->playback_hw_params
);
1919 driver
->playback_hw_params
= 0;
1922 if (driver
->capture_sw_params
) {
1923 snd_pcm_sw_params_free (driver
->capture_sw_params
);
1924 driver
->capture_sw_params
= 0;
1927 if (driver
->playback_sw_params
) {
1928 snd_pcm_sw_params_free (driver
->playback_sw_params
);
1929 driver
->playback_sw_params
= 0;
1937 driver
->hw
->release (driver
->hw
);
1940 free(driver
->alsa_name_playback
);
1941 free(driver
->alsa_name_capture
);
1942 free(driver
->alsa_driver
);
1944 alsa_driver_release_channel_dependent_memory (driver
);
1946 //jack_driver_nt_finish ((jack_driver_nt_t *) driver);
1951 discover_alsa_using_apps ()
1955 char* path
= getenv ("PATH");
1966 /* look for lsof and give up if its not in PATH */
1968 path
= strdup (path
);
1969 dir
= strtok (path
, ":");
1971 char maybe
[PATH_MAX
+1];
1972 snprintf (maybe
, sizeof(maybe
), "%s/lsof", dir
);
1973 if (access (maybe
, X_OK
) == 0) {
1976 dir
= strtok (NULL
, ":");
1984 snprintf (command
, sizeof (command
), "lsof -Fc0 ");
1985 cmdlen
= strlen (command
);
1987 for (card
= 0; card
< 8; ++card
) {
1988 for (device
= 0; device
< 8; ++device
) {
1991 snprintf (buf
, sizeof (buf
), "/dev/snd/pcmC%dD%dp", card
, device
);
1992 if (access (buf
, F_OK
) == 0) {
1993 snprintf (command
+cmdlen
, sizeof(command
)-cmdlen
, "%s ", buf
);
1995 cmdlen
= strlen (command
);
1997 snprintf (buf
, sizeof (buf
), "/dev/snd/pcmC%dD%dc", card
, device
);
1998 if (access (buf
, F_OK
) == 0) {
1999 snprintf (command
+cmdlen
, sizeof(command
)-cmdlen
, "%s ", buf
);
2001 cmdlen
= strlen (command
);
2005 FILE* f
= popen (command
, "r");
2012 char buf
[1024]; /* lsof doesn't output much */
2014 if (!fgets (buf
, sizeof (buf
), f
)) {
2022 /* buf contains NULL as a separator between the process field and the command field */
2024 ++pid
; /* skip leading 'p' */
2031 ++cmd
; /* skip to 'c' */
2032 ++cmd
; /* skip to first character of command */
2034 snprintf (found
+flen
, sizeof (found
)-flen
, "%s (process ID %s)\n", cmd
, pid
);
2035 flen
= strlen (found
);
2037 if (flen
>= sizeof (found
)) {
2045 return strdup (found
);
2052 alsa_driver_new (char *name
, char *playback_alsa_device
,
2053 char *capture_alsa_device
,
2054 jack_client_t
*client
,
2055 jack_nframes_t frames_per_cycle
,
2056 jack_nframes_t user_nperiods
,
2057 jack_nframes_t rate
,
2062 DitherAlgorithm dither
,
2065 int user_capture_nchnls
,
2066 int user_playback_nchnls
,
2068 jack_nframes_t capture_latency
,
2069 jack_nframes_t playback_latency
,
2070 alsa_midi_t
*midi_driver
2075 alsa_driver_t
*driver
;
2077 jack_info ("creating alsa driver ... %s|%s|%" PRIu32
"|%" PRIu32
2078 "|%" PRIu32
"|%" PRIu32
"|%" PRIu32
"|%s|%s|%s|%s",
2079 playing
? playback_alsa_device
: "-",
2080 capturing
? capture_alsa_device
: "-",
2081 frames_per_cycle
, user_nperiods
, rate
,
2082 user_capture_nchnls
,user_playback_nchnls
,
2083 hw_monitoring
? "hwmon": "nomon",
2084 hw_metering
? "hwmeter":"swmeter",
2085 soft_mode
? "soft-mode":"-",
2086 shorts_first
? "16bit":"32bit");
2088 driver
= (alsa_driver_t
*) calloc (1, sizeof (alsa_driver_t
));
2090 jack_driver_nt_init ((jack_driver_nt_t
*) driver
);
2094 driver->nt_attach = (JackDriverNTAttachFunction) alsa_driver_attach;
2095 driver->nt_detach = (JackDriverNTDetachFunction) alsa_driver_detach;
2096 driver->read = (JackDriverReadFunction) alsa_driver_read;
2097 driver->write = (JackDriverReadFunction) alsa_driver_write;
2098 driver->null_cycle = (JackDriverNullCycleFunction) alsa_driver_null_cycle;
2099 driver->nt_bufsize = (JackDriverNTBufSizeFunction) alsa_driver_bufsize;
2100 driver->nt_start = (JackDriverNTStartFunction) alsa_driver_start;
2101 driver->nt_stop = (JackDriverNTStopFunction) alsa_driver_stop;
2102 driver->nt_run_cycle = (JackDriverNTRunCycleFunction) alsa_driver_run_cycle;
2105 driver
->playback_handle
= NULL
;
2106 driver
->capture_handle
= NULL
;
2107 driver
->ctl_handle
= 0;
2109 driver
->capture_and_playback_not_synced
= FALSE
;
2110 driver
->max_nchannels
= 0;
2111 driver
->playback_nchannels
= user_playback_nchnls
;
2112 driver
->capture_nchannels
= user_capture_nchnls
;
2113 driver
->playback_sample_bytes
= (shorts_first
? 2:4);
2114 driver
->capture_sample_bytes
= (shorts_first
? 2:4);
2115 driver
->capture_frame_latency
= capture_latency
;
2116 driver
->playback_frame_latency
= playback_latency
;
2118 driver
->playback_addr
= 0;
2119 driver
->capture_addr
= 0;
2120 driver
->playback_interleave_skip
= NULL
;
2121 driver
->capture_interleave_skip
= NULL
;
2125 driver
->all_monitor_in
= FALSE
;
2126 driver
->with_monitor_ports
= monitor
;
2128 driver
->clock_mode
= ClockMaster
; /* XXX is it? */
2129 driver
->input_monitor_mask
= 0; /* XXX is it? */
2131 driver
->capture_ports
= 0;
2132 driver
->playback_ports
= 0;
2133 driver
->monitor_ports
= 0;
2136 driver
->playback_nfds
= 0;
2137 driver
->capture_nfds
= 0;
2139 driver
->dither
= dither
;
2140 driver
->soft_mode
= soft_mode
;
2142 driver
->quirk_bswap
= 0;
2144 pthread_mutex_init (&driver
->clock_sync_lock
, 0);
2145 driver
->clock_sync_listeners
= 0;
2147 driver
->poll_late
= 0;
2148 driver
->xrun_count
= 0;
2149 driver
->process_count
= 0;
2151 driver
->alsa_name_playback
= strdup (playback_alsa_device
);
2152 driver
->alsa_name_capture
= strdup (capture_alsa_device
);
2154 driver
->midi
= midi_driver
;
2155 driver
->xrun_recovery
= 0;
2157 if (alsa_driver_check_card_type (driver
)) {
2158 alsa_driver_delete (driver
);
2162 alsa_driver_hw_specific (driver
, hw_monitoring
, hw_metering
);
2165 if (snd_pcm_open (&driver
->playback_handle
,
2166 playback_alsa_device
,
2167 SND_PCM_STREAM_PLAYBACK
,
2168 SND_PCM_NONBLOCK
) < 0) {
2172 jack_error ("\n\nATTENTION: The playback device \"%s\" is "
2173 "already in use. Please stop the"
2174 " application using it and "
2176 playback_alsa_device
);
2178 current_apps
= discover_alsa_using_apps ();
2180 jack_error ("\n\nATTENTION: The playback device \"%s\" is "
2181 "already in use. The following applications "
2182 " are using your soundcard(s) so you should "
2183 " check them and stop them as necessary before "
2184 " trying to start JACK again:\n\n%s",
2185 playback_alsa_device
,
2187 free (current_apps
);
2189 jack_error ("\n\nATTENTION: The playback device \"%s\" is "
2190 "already in use. Please stop the"
2191 " application using it and "
2193 playback_alsa_device
);
2196 alsa_driver_delete (driver
);
2200 jack_error ("you do not have permission to open "
2201 "the audio device \"%s\" for playback",
2202 playback_alsa_device
);
2203 alsa_driver_delete (driver
);
2208 driver
->playback_handle
= NULL
;
2211 if (driver
->playback_handle
) {
2212 snd_pcm_nonblock (driver
->playback_handle
, 0);
2217 if (snd_pcm_open (&driver
->capture_handle
,
2218 capture_alsa_device
,
2219 SND_PCM_STREAM_CAPTURE
,
2220 SND_PCM_NONBLOCK
) < 0) {
2224 jack_error ("\n\nATTENTION: The capture (recording) device \"%s\" is "
2226 capture_alsa_device
);
2228 current_apps
= discover_alsa_using_apps ();
2230 jack_error ("\n\nATTENTION: The capture device \"%s\" is "
2231 "already in use. The following applications "
2232 " are using your soundcard(s) so you should "
2233 " check them and stop them as necessary before "
2234 " trying to start JACK again:\n\n%s",
2235 capture_alsa_device
,
2237 free (current_apps
);
2239 jack_error ("\n\nATTENTION: The capture (recording) device \"%s\" is "
2240 "already in use. Please stop the"
2241 " application using it and "
2243 capture_alsa_device
);
2245 alsa_driver_delete (driver
);
2251 jack_error ("you do not have permission to open "
2252 "the audio device \"%s\" for capture",
2253 capture_alsa_device
);
2254 alsa_driver_delete (driver
);
2259 driver
->capture_handle
= NULL
;
2262 if (driver
->capture_handle
) {
2263 snd_pcm_nonblock (driver
->capture_handle
, 0);
2267 if (driver
->playback_handle
== NULL
) {
2270 /* they asked for playback, but we can't do it */
2272 jack_error ("ALSA: Cannot open PCM device %s for "
2273 "playback. Falling back to capture-only"
2276 if (driver
->capture_handle
== NULL
) {
2277 /* can't do anything */
2278 alsa_driver_delete (driver
);
2286 if (driver
->capture_handle
== NULL
) {
2289 /* they asked for capture, but we can't do it */
2291 jack_error ("ALSA: Cannot open PCM device %s for "
2292 "capture. Falling back to playback-only"
2295 if (driver
->playback_handle
== NULL
) {
2296 /* can't do anything */
2297 alsa_driver_delete (driver
);
2305 driver
->playback_hw_params
= 0;
2306 driver
->capture_hw_params
= 0;
2307 driver
->playback_sw_params
= 0;
2308 driver
->capture_sw_params
= 0;
2310 if (driver
->playback_handle
) {
2311 if ((err
= snd_pcm_hw_params_malloc (
2312 &driver
->playback_hw_params
)) < 0) {
2313 jack_error ("ALSA: could not allocate playback hw"
2314 " params structure");
2315 alsa_driver_delete (driver
);
2319 if ((err
= snd_pcm_sw_params_malloc (
2320 &driver
->playback_sw_params
)) < 0) {
2321 jack_error ("ALSA: could not allocate playback sw"
2322 " params structure");
2323 alsa_driver_delete (driver
);
2328 if (driver
->capture_handle
) {
2329 if ((err
= snd_pcm_hw_params_malloc (
2330 &driver
->capture_hw_params
)) < 0) {
2331 jack_error ("ALSA: could not allocate capture hw"
2332 " params structure");
2333 alsa_driver_delete (driver
);
2337 if ((err
= snd_pcm_sw_params_malloc (
2338 &driver
->capture_sw_params
)) < 0) {
2339 jack_error ("ALSA: could not allocate capture sw"
2340 " params structure");
2341 alsa_driver_delete (driver
);
2346 if (alsa_driver_set_parameters (driver
, frames_per_cycle
,
2347 user_nperiods
, rate
)) {
2348 alsa_driver_delete (driver
);
2352 driver
->capture_and_playback_not_synced
= FALSE
;
2354 if (driver
->capture_handle
&& driver
->playback_handle
) {
2355 if (snd_pcm_link (driver
->playback_handle
,
2356 driver
->capture_handle
) != 0) {
2357 driver
->capture_and_playback_not_synced
= TRUE
;
2361 driver
->client
= client
;
2363 return (jack_driver_t
*) driver
;
2367 alsa_driver_listen_for_clock_sync_status (alsa_driver_t
*driver
,
2368 ClockSyncListenerFunction func
,
2371 ClockSyncListener
*csl
;
2373 csl
= (ClockSyncListener
*) malloc (sizeof (ClockSyncListener
));
2374 csl
->function
= func
;
2376 csl
->id
= driver
->next_clock_sync_listener_id
++;
2378 pthread_mutex_lock (&driver
->clock_sync_lock
);
2379 driver
->clock_sync_listeners
=
2380 jack_slist_prepend (driver
->clock_sync_listeners
, csl
);
2381 pthread_mutex_unlock (&driver
->clock_sync_lock
);
2386 alsa_driver_stop_listening_to_clock_sync_status (alsa_driver_t
*driver
,
2392 pthread_mutex_lock (&driver
->clock_sync_lock
);
2393 for (node
= driver
->clock_sync_listeners
; node
;
2394 node
= jack_slist_next (node
)) {
2395 if (((ClockSyncListener
*) node
->data
)->id
== which
) {
2396 driver
->clock_sync_listeners
=
2397 jack_slist_remove_link (
2398 driver
->clock_sync_listeners
, node
);
2400 jack_slist_free_1 (node
);
2405 pthread_mutex_unlock (&driver
->clock_sync_lock
);
2410 alsa_driver_clock_sync_notify (alsa_driver_t
*driver
, channel_t chn
,
2411 ClockSyncStatus status
)
2415 pthread_mutex_lock (&driver
->clock_sync_lock
);
2416 for (node
= driver
->clock_sync_listeners
; node
;
2417 node
= jack_slist_next (node
)) {
2418 ClockSyncListener
*csl
= (ClockSyncListener
*) node
->data
;
2419 csl
->function (chn
, status
, csl
->arg
);
2421 pthread_mutex_unlock (&driver
->clock_sync_lock
);
2425 /* DRIVER "PLUGIN" INTERFACE */
2427 const char driver_client_name
[] = "alsa_pcm";
2430 driver_finish (jack_driver_t
*driver
)
2432 alsa_driver_delete ((alsa_driver_t
*) driver
);