use alsa mmap feature if supported

This commit is contained in:
Yihui Xiong
2016-07-07 15:28:32 +08:00
parent 11b77b77c4
commit 8e847aa4a4
+13 -3
View File
@@ -85,6 +85,8 @@ static int alsa_mix_index = 0;
static int hardware_mixer = 0; static int hardware_mixer = 0;
static int has_softvol = 0; static int has_softvol = 0;
static snd_pcm_sframes_t (*alsa_pcm_write)(snd_pcm_t *, const void *, snd_pcm_uframes_t) = snd_pcm_writei;
static int play_number; static int play_number;
static int64_t accumulated_delay, accumulated_da_delay; static int64_t accumulated_delay, accumulated_da_delay;
int alsa_characteristics_already_listed = 0; int alsa_characteristics_already_listed = 0;
@@ -373,6 +375,7 @@ int open_alsa_device(void) {
unsigned int my_sample_rate = desired_sample_rate; unsigned int my_sample_rate = desired_sample_rate;
// snd_pcm_uframes_t frames = 441 * 10; // snd_pcm_uframes_t frames = 441 * 10;
snd_pcm_uframes_t buffer_size, actual_buffer_length; snd_pcm_uframes_t buffer_size, actual_buffer_length;
snd_pcm_access_t access;
ret = snd_pcm_open(&alsa_handle, alsa_out_dev, SND_PCM_STREAM_PLAYBACK, 0); ret = snd_pcm_open(&alsa_handle, alsa_out_dev, SND_PCM_STREAM_PLAYBACK, 0);
if (ret < 0) if (ret < 0)
@@ -389,8 +392,15 @@ int open_alsa_device(void) {
alsa_out_dev); alsa_out_dev);
} }
ret = snd_pcm_hw_params_set_access(alsa_handle, alsa_params, if (snd_pcm_hw_params_set_access(alsa_handle, alsa_params, SND_PCM_ACCESS_MMAP_INTERLEAVED) >= 0) {
SND_PCM_ACCESS_RW_INTERLEAVED); access = SND_PCM_ACCESS_MMAP_INTERLEAVED;
alsa_pcm_write = snd_pcm_mmap_writei;
} else {
access = SND_PCM_ACCESS_RW_INTERLEAVED;
alsa_pcm_write = snd_pcm_writei;
}
ret = snd_pcm_hw_params_set_access(alsa_handle, alsa_params, access);
if (ret < 0) { if (ret < 0) {
die("audio_alsa: Access type not available for device \"%s\": %s", die("audio_alsa: Access type not available for device \"%s\": %s",
alsa_out_dev, snd_strerror(ret)); alsa_out_dev, snd_strerror(ret));
@@ -684,7 +694,7 @@ static void play(short buf[], int samples) {
if (samples==0) if (samples==0)
debug(1,"empty buffer being passed to pcm_writei -- skipping it"); debug(1,"empty buffer being passed to pcm_writei -- skipping it");
if ((samples!=0) && (buf!=NULL)) { if ((samples!=0) && (buf!=NULL)) {
err = snd_pcm_writei(alsa_handle, (char *)buf, samples); err = alsa_pcm_write(alsa_handle, (char *)buf, samples);
if (err < 0) { if (err < 0) {
debug(1, "Error %d writing %d samples in play(): \"%s\".", err, samples, debug(1, "Error %d writing %d samples in play(): \"%s\".", err, samples,
snd_strerror(err)); snd_strerror(err));