alsa: improve debug

Use a new state variable to store the device name and direction so that
we consistently can debug those.
This commit is contained in:
Wim Taymans 2023-09-15 09:09:04 +02:00
parent 3c5da11706
commit 99cf172bc7
2 changed files with 49 additions and 48 deletions

View file

@ -584,7 +584,7 @@ static int probe_pitch_ctl(struct state *state, const char* device_name)
err = snd_ctl_open(&state->ctl, device_name, SND_CTL_NONBLOCK); err = snd_ctl_open(&state->ctl, device_name, SND_CTL_NONBLOCK);
if (err < 0) { if (err < 0) {
spa_log_info(state->log, "%s could not find ctl device: %s", spa_log_info(state->log, "%s could not find ctl device: %s",
state->props.device, snd_strerror(err)); device_name, snd_strerror(err));
state->ctl = NULL; state->ctl = NULL;
goto error; goto error;
} }
@ -599,7 +599,7 @@ static int probe_pitch_ctl(struct state *state, const char* device_name)
err = snd_ctl_elem_read(state->ctl, state->pitch_elem); err = snd_ctl_elem_read(state->ctl, state->pitch_elem);
if (err < 0) { if (err < 0) {
spa_log_debug(state->log, "%s: did not find ctl %s: %s", spa_log_debug(state->log, "%s: did not find ctl %s: %s",
state->props.device, elem_name, snd_strerror(err)); device_name, elem_name, snd_strerror(err));
snd_ctl_elem_value_free(state->pitch_elem); snd_ctl_elem_value_free(state->pitch_elem);
state->pitch_elem = NULL; state->pitch_elem = NULL;
@ -613,7 +613,7 @@ static int probe_pitch_ctl(struct state *state, const char* device_name)
CHECK(snd_ctl_elem_write(state->ctl, state->pitch_elem), "snd_ctl_elem_write"); CHECK(snd_ctl_elem_write(state->ctl, state->pitch_elem), "snd_ctl_elem_write");
state->last_rate = 1.0; state->last_rate = 1.0;
spa_log_info(state->log, "%s: found ctl %s", state->props.device, elem_name); spa_log_info(state->log, "%s: found ctl %s", device_name, elem_name);
err = 0; err = 0;
error: error:
snd_lib_error_set_handler(NULL); snd_lib_error_set_handler(NULL);
@ -632,6 +632,8 @@ int spa_alsa_open(struct state *state, const char *params)
spa_scnprintf(device_name, sizeof(device_name), "%s%s%s", spa_scnprintf(device_name, sizeof(device_name), "%s%s%s",
state->card->ucm_prefix ? state->card->ucm_prefix : "", state->card->ucm_prefix ? state->card->ucm_prefix : "",
props->device, params ? params : ""); props->device, params ? params : "");
spa_scnprintf(state->name, sizeof(state->name), "%s%s",
props->device, state->stream == SND_PCM_STREAM_CAPTURE ? "c" : "p");
spa_log_info(state->log, "%p: ALSA device open '%s' %s", state, device_name, spa_log_info(state->log, "%p: ALSA device open '%s' %s", state, device_name,
state->stream == SND_PCM_STREAM_CAPTURE ? "capture" : "playback"); state->stream == SND_PCM_STREAM_CAPTURE ? "capture" : "playback");
@ -663,7 +665,7 @@ int spa_alsa_open(struct state *state, const char *params)
return 0; return 0;
error_exit_close: error_exit_close:
spa_log_info(state->log, "%p: Device '%s' closing: %s", state, state->props.device, spa_log_info(state->log, "%p: Device '%s' closing: %s", state, state->name,
spa_strerror(err)); spa_strerror(err));
snd_pcm_close(state->hndl); snd_pcm_close(state->hndl);
return err; return err;
@ -678,9 +680,9 @@ int spa_alsa_close(struct state *state)
spa_alsa_pause(state); spa_alsa_pause(state);
spa_log_info(state->log, "%p: Device '%s' closing", state, state->props.device); spa_log_info(state->log, "%p: Device '%s' closing", state, state->name);
if ((err = snd_pcm_close(state->hndl)) < 0) if ((err = snd_pcm_close(state->hndl)) < 0)
spa_log_warn(state->log, "%s: close failed: %s", state->props.device, spa_log_warn(state->log, "%s: close failed: %s", state->name,
snd_strerror(err)); snd_strerror(err));
if (!state->disable_tsched) if (!state->disable_tsched)
@ -1090,7 +1092,7 @@ static int enum_pcm_formats(struct state *state, uint32_t index, uint32_t *next,
CHECK(snd_pcm_hw_params_set_channels_near(hndl, params, &rchannels), "set_channels"); CHECK(snd_pcm_hw_params_set_channels_near(hndl, params, &rchannels), "set_channels");
if (state->default_channels != rchannels) { if (state->default_channels != rchannels) {
spa_log_warn(state->log, "%s: Channels doesn't match (requested %u, got %u)", spa_log_warn(state->log, "%s: Channels doesn't match (requested %u, got %u)",
state->props.device, state->default_channels, rchannels); state->name, state->default_channels, rchannels);
} }
} }
if (state->default_rate != 0) { if (state->default_rate != 0) {
@ -1098,7 +1100,7 @@ static int enum_pcm_formats(struct state *state, uint32_t index, uint32_t *next,
CHECK(snd_pcm_hw_params_set_rate_near(hndl, params, &rrate, 0), "set_rate_near"); CHECK(snd_pcm_hw_params_set_rate_near(hndl, params, &rrate, 0), "set_rate_near");
if (state->default_rate != rrate) { if (state->default_rate != rrate) {
spa_log_warn(state->log, "%s: Rate doesn't match (requested %u, got %u)", spa_log_warn(state->log, "%s: Rate doesn't match (requested %u, got %u)",
state->props.device, state->default_rate, rrate); state->name, state->default_rate, rrate);
} }
} }
@ -1160,7 +1162,7 @@ static int enum_pcm_formats(struct state *state, uint32_t index, uint32_t *next,
} }
} }
spa_log_warn(state->log, "%s: no format found (def:%d) formats:%s", spa_log_warn(state->log, "%s: no format found (def:%d) formats:%s",
state->props.device, state->default_format, buf); state->name, state->default_format, buf);
for (i = 0, offs = 0; i <= SND_PCM_ACCESS_LAST; i++) { for (i = 0, offs = 0; i <= SND_PCM_ACCESS_LAST; i++) {
if (snd_pcm_access_mask_test(amask, (snd_pcm_access_t)i)) { if (snd_pcm_access_mask_test(amask, (snd_pcm_access_t)i)) {
@ -1171,7 +1173,7 @@ static int enum_pcm_formats(struct state *state, uint32_t index, uint32_t *next,
offs += r; offs += r;
} }
} }
spa_log_warn(state->log, "%s: access:%s", state->props.device, buf); spa_log_warn(state->log, "%s: access:%s", state->name, buf);
return -ENOTSUP; return -ENOTSUP;
} }
@ -1546,7 +1548,7 @@ int spa_alsa_set_format(struct state *state, struct spa_audio_info *fmt, uint32_
if (rformat == SND_PCM_FORMAT_UNKNOWN) { if (rformat == SND_PCM_FORMAT_UNKNOWN) {
spa_log_warn(state->log, "%s: unknown format", spa_log_warn(state->log, "%s: unknown format",
state->props.device); state->name);
return -EINVAL; return -EINVAL;
} }
@ -1584,7 +1586,7 @@ int spa_alsa_set_format(struct state *state, struct spa_audio_info *fmt, uint32_
planar ? SND_PCM_ACCESS_RW_NONINTERLEAVED planar ? SND_PCM_ACCESS_RW_NONINTERLEAVED
: SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { : SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
spa_log_error(state->log, "%s: RW not possible: %s", spa_log_error(state->log, "%s: RW not possible: %s",
state->props.device, snd_strerror(err)); state->name, snd_strerror(err));
return err; return err;
} }
} }
@ -1601,7 +1603,7 @@ int spa_alsa_set_format(struct state *state, struct spa_audio_info *fmt, uint32_
CHECK(snd_pcm_hw_params_set_channels_near(hndl, params, &val), "set_channels"); CHECK(snd_pcm_hw_params_set_channels_near(hndl, params, &val), "set_channels");
if (rchannels != val) { if (rchannels != val) {
spa_log_warn(state->log, "%s: Channels doesn't match (requested %u, got %u)", spa_log_warn(state->log, "%s: Channels doesn't match (requested %u, got %u)",
state->props.device, rchannels, val); state->name, rchannels, val);
if (!SPA_FLAG_IS_SET(flags, SPA_NODE_PARAM_FLAG_NEAREST)) if (!SPA_FLAG_IS_SET(flags, SPA_NODE_PARAM_FLAG_NEAREST))
return -EINVAL; return -EINVAL;
if (fmt->media_subtype != SPA_MEDIA_SUBTYPE_raw) if (fmt->media_subtype != SPA_MEDIA_SUBTYPE_raw)
@ -1624,7 +1626,7 @@ int spa_alsa_set_format(struct state *state, struct spa_audio_info *fmt, uint32_
CHECK(snd_pcm_hw_params_set_rate_near(hndl, params, &val, 0), "set_rate_near"); CHECK(snd_pcm_hw_params_set_rate_near(hndl, params, &val, 0), "set_rate_near");
if (rrate != val) { if (rrate != val) {
spa_log_warn(state->log, "%s: Rate doesn't match (requested %iHz, got %iHz)", spa_log_warn(state->log, "%s: Rate doesn't match (requested %iHz, got %iHz)",
state->props.device, rrate, val); state->name, rrate, val);
if (!SPA_FLAG_IS_SET(flags, SPA_NODE_PARAM_FLAG_NEAREST)) if (!SPA_FLAG_IS_SET(flags, SPA_NODE_PARAM_FLAG_NEAREST))
return -EINVAL; return -EINVAL;
if (fmt->media_subtype != SPA_MEDIA_SUBTYPE_raw) if (fmt->media_subtype != SPA_MEDIA_SUBTYPE_raw)
@ -1635,7 +1637,7 @@ int spa_alsa_set_format(struct state *state, struct spa_audio_info *fmt, uint32_
} }
if (rchannels == 0 || rrate == 0) { if (rchannels == 0 || rrate == 0) {
spa_log_error(state->log, "%s: invalid channels:%d or rate:%d", spa_log_error(state->log, "%s: invalid channels:%d or rate:%d",
state->props.device, rchannels, rrate); state->name, rchannels, rrate);
return -EIO; return -EIO;
} }
@ -1686,7 +1688,7 @@ int spa_alsa_set_format(struct state *state, struct spa_audio_info *fmt, uint32_
CHECK(snd_pcm_hw_params_set_period_size_near(hndl, params, &period_size, &dir), "set_period_size_near"); CHECK(snd_pcm_hw_params_set_period_size_near(hndl, params, &period_size, &dir), "set_period_size_near");
if (period_size == 0) { if (period_size == 0) {
spa_log_error(state->log, "%s: invalid period_size 0 (driver error?)", state->props.device); spa_log_error(state->log, "%s: invalid period_size 0 (driver error?)", state->name);
return -EIO; return -EIO;
} }
@ -1706,7 +1708,7 @@ int spa_alsa_set_format(struct state *state, struct spa_audio_info *fmt, uint32_
periods = state->buffer_frames / period_size; periods = state->buffer_frames / period_size;
} }
if (state->buffer_frames == 0) { if (state->buffer_frames == 0) {
spa_log_error(state->log, "%s: invalid buffer_frames 0 (driver error?)", state->props.device); spa_log_error(state->log, "%s: invalid buffer_frames 0 (driver error?)", state->name);
return -EIO; return -EIO;
} }
@ -1741,12 +1743,10 @@ int spa_alsa_set_format(struct state *state, struct spa_audio_info *fmt, uint32_
state->latency[state->port_direction].min_rate = state->latency[state->port_direction].min_rate =
state->latency[state->port_direction].max_rate = latency; state->latency[state->port_direction].max_rate = latency;
spa_log_info(state->log, "%s (%s): format:%s access:%s-%s rate:%d channels:%d " spa_log_info(state->log, "%s: format:%s access:%s-%s rate:%d channels:%d "
"buffer frames %lu, period frames %lu, periods %u, frame_size %zd " "buffer frames %lu, period frames %lu, periods %u, frame_size %zd "
"headroom %u start-delay:%u batch:%u tsched:%u", "headroom %u start-delay:%u batch:%u tsched:%u",
state->props.device, state->name, snd_pcm_format_name(state->format),
state->stream == SND_PCM_STREAM_CAPTURE ? "capture" : "playback",
snd_pcm_format_name(state->format),
state->use_mmap ? "mmap" : "rw", state->use_mmap ? "mmap" : "rw",
planar ? "planar" : "interleaved", planar ? "planar" : "interleaved",
state->rate, state->channels, state->buffer_frames, state->period_frames, state->rate, state->channels, state->buffer_frames, state->period_frames,
@ -1787,7 +1787,7 @@ int spa_alsa_update_rate_match(struct state *state)
CHECK(snd_ctl_elem_write(state->ctl, state->pitch_elem), "snd_ctl_elem_write"); CHECK(snd_ctl_elem_write(state->ctl, state->pitch_elem), "snd_ctl_elem_write");
spa_log_trace_fp(state->log, "%s %u set rate to %g", spa_log_trace_fp(state->log, "%s %u set rate to %g",
state->props.device, state->stream, state->rate_match->rate); state->name, state->stream, state->rate_match->rate);
state->last_rate = state->rate_match->rate; state->last_rate = state->rate_match->rate;
@ -1871,7 +1871,7 @@ int spa_alsa_silence(struct state *state, snd_pcm_uframes_t silence)
if (SPA_UNLIKELY((res = snd_pcm_mmap_begin(hndl, &my_areas, &offset, &frames)) < 0)) { if (SPA_UNLIKELY((res = snd_pcm_mmap_begin(hndl, &my_areas, &offset, &frames)) < 0)) {
spa_log_error(state->log, "%s: snd_pcm_mmap_begin error: %s", spa_log_error(state->log, "%s: snd_pcm_mmap_begin error: %s",
state->props.device, snd_strerror(res)); state->name, snd_strerror(res));
return res; return res;
} }
silence = SPA_MIN(silence, frames); silence = SPA_MIN(silence, frames);
@ -1882,7 +1882,7 @@ int spa_alsa_silence(struct state *state, snd_pcm_uframes_t silence)
if (SPA_UNLIKELY((res = snd_pcm_mmap_commit(hndl, offset, silence)) < 0)) { if (SPA_UNLIKELY((res = snd_pcm_mmap_commit(hndl, offset, silence)) < 0)) {
spa_log_error(state->log, "%s: snd_pcm_mmap_commit error: %s", spa_log_error(state->log, "%s: snd_pcm_mmap_commit error: %s",
state->props.device, snd_strerror(res)); state->name, snd_strerror(res));
return res; return res;
} }
} else { } else {
@ -1908,7 +1908,7 @@ static inline int do_start(struct state *state)
spa_log_trace(state->log, "%p: snd_pcm_start", state); spa_log_trace(state->log, "%p: snd_pcm_start", state);
if ((res = snd_pcm_start(state->hndl)) < 0) { if ((res = snd_pcm_start(state->hndl)) < 0) {
spa_log_error(state->log, "%s: snd_pcm_start: %s", spa_log_error(state->log, "%s: snd_pcm_start: %s",
state->props.device, snd_strerror(res)); state->name, snd_strerror(res));
return res; return res;
} }
state->alsa_started = true; state->alsa_started = true;
@ -1924,7 +1924,7 @@ static int alsa_recover(struct state *state, int err)
snd_pcm_status_alloca(&status); snd_pcm_status_alloca(&status);
if (SPA_UNLIKELY((res = snd_pcm_status(state->hndl, status)) < 0)) { if (SPA_UNLIKELY((res = snd_pcm_status(state->hndl, status)) < 0)) {
spa_log_error(state->log, "%s: snd_pcm_status error: %s", spa_log_error(state->log, "%s: snd_pcm_status error: %s",
state->props.device, snd_strerror(res)); state->name, snd_strerror(res));
goto recover; goto recover;
} }
@ -1956,7 +1956,7 @@ static int alsa_recover(struct state *state, int err)
} }
case SND_PCM_STATE_SUSPENDED: case SND_PCM_STATE_SUSPENDED:
spa_log_info(state->log, "%s: recover from state %s", spa_log_info(state->log, "%s: recover from state %s",
state->props.device, snd_pcm_state_name(st)); state->name, snd_pcm_state_name(st));
res = snd_pcm_resume(state->hndl); res = snd_pcm_resume(state->hndl);
if (res >= 0) if (res >= 0)
return res; return res;
@ -1964,14 +1964,14 @@ static int alsa_recover(struct state *state, int err)
break; break;
default: default:
spa_log_error(state->log, "%s: recover from error state %s", spa_log_error(state->log, "%s: recover from error state %s",
state->props.device, snd_pcm_state_name(st)); state->name, snd_pcm_state_name(st));
break; break;
} }
recover: recover:
if (SPA_UNLIKELY((res = snd_pcm_recover(state->hndl, err, true)) < 0)) { if (SPA_UNLIKELY((res = snd_pcm_recover(state->hndl, err, true)) < 0)) {
spa_log_error(state->log, "%s: snd_pcm_recover error: %s", spa_log_error(state->log, "%s: snd_pcm_recover error: %s",
state->props.device, snd_strerror(res)); state->name, snd_strerror(res));
return res; return res;
} }
spa_dll_init(&state->dll); spa_dll_init(&state->dll);
@ -2003,7 +2003,7 @@ static int get_avail(struct state *state, uint64_t current_time, snd_pcm_uframes
if ((avail = alsa_avail(state)) < 0) { if ((avail = alsa_avail(state)) < 0) {
if ((suppressed = spa_ratelimit_test(&state->rate_limit, current_time)) >= 0) { if ((suppressed = spa_ratelimit_test(&state->rate_limit, current_time)) >= 0) {
spa_log_warn(state->log, "%s: (%d suppressed) snd_pcm_avail after recover: %s", spa_log_warn(state->log, "%s: (%d suppressed) snd_pcm_avail after recover: %s",
state->props.device, suppressed, snd_strerror(avail)); state->name, suppressed, snd_strerror(avail));
} }
avail = state->threshold * 2; avail = state->threshold * 2;
} }
@ -2020,7 +2020,7 @@ static int get_avail(struct state *state, uint64_t current_time, snd_pcm_uframes
if ((res = snd_pcm_htimestamp(state->hndl, &havail, &tstamp)) < 0) { if ((res = snd_pcm_htimestamp(state->hndl, &havail, &tstamp)) < 0) {
if ((suppressed = spa_ratelimit_test(&state->rate_limit, current_time)) >= 0) { if ((suppressed = spa_ratelimit_test(&state->rate_limit, current_time)) >= 0) {
spa_log_warn(state->log, "%s: (%d suppressed) snd_pcm_htimestamp error: %s", spa_log_warn(state->log, "%s: (%d suppressed) snd_pcm_htimestamp error: %s",
state->props.device, suppressed, snd_strerror(res)); state->name, suppressed, snd_strerror(res));
} }
return avail; return avail;
} }
@ -2042,13 +2042,13 @@ static int get_avail(struct state *state, uint64_t current_time, snd_pcm_uframes
} else { } else {
if (++state->htimestamp_error > MAX_HTIMESTAMP_ERROR) { if (++state->htimestamp_error > MAX_HTIMESTAMP_ERROR) {
spa_log_error(state->log, "%s: wrong htimestamps from driver, disabling", spa_log_error(state->log, "%s: wrong htimestamps from driver, disabling",
state->props.device); state->name);
state->htimestamp_error = 0; state->htimestamp_error = 0;
state->htimestamp = false; state->htimestamp = false;
} }
else if ((suppressed = spa_ratelimit_test(&state->rate_limit, current_time)) >= 0) { else if ((suppressed = spa_ratelimit_test(&state->rate_limit, current_time)) >= 0) {
spa_log_warn(state->log, "%s: (%d suppressed) impossible htimestamp diff:%"PRIi64, spa_log_warn(state->log, "%s: (%d suppressed) impossible htimestamp diff:%"PRIi64,
state->props.device, suppressed, diff); state->name, suppressed, diff);
} }
} }
} }
@ -2141,7 +2141,7 @@ static int update_time(struct state *state, uint64_t current_time, snd_pcm_sfram
spa_log_debug(state->log, "%s: follower:%d match:%d rate:%f " spa_log_debug(state->log, "%s: follower:%d match:%d rate:%f "
"bw:%f thr:%u del:%ld target:%ld err:%f max:%f", "bw:%f thr:%u del:%ld target:%ld err:%f max:%f",
state->props.device, follower, state->matching, state->name, follower, state->matching,
corr, state->dll.bw, state->threshold, delay, target, corr, state->dll.bw, state->threshold, delay, target,
err, state->max_error); err, state->max_error);
} }
@ -2284,7 +2284,7 @@ int spa_alsa_write(struct state *state)
if ((suppressed = spa_ratelimit_test(&state->rate_limit, current_time)) >= 0) { if ((suppressed = spa_ratelimit_test(&state->rate_limit, current_time)) >= 0) {
spa_log_lev(state->log, lev, "%s: follower avail:%lu delay:%ld " spa_log_lev(state->log, lev, "%s: follower avail:%lu delay:%ld "
"target:%ld thr:%u, resync (%d suppressed)", "target:%ld thr:%u, resync (%d suppressed)",
state->props.device, avail, delay, state->name, avail, delay,
target, state->threshold, suppressed); target, state->threshold, suppressed);
} }
@ -2305,7 +2305,7 @@ again:
if (state->use_mmap && frames > 0) { if (state->use_mmap && frames > 0) {
if (SPA_UNLIKELY((res = snd_pcm_mmap_begin(hndl, &my_areas, &offset, &frames)) < 0)) { if (SPA_UNLIKELY((res = snd_pcm_mmap_begin(hndl, &my_areas, &offset, &frames)) < 0)) {
spa_log_error(state->log, "%s: snd_pcm_mmap_begin error: %s", spa_log_error(state->log, "%s: snd_pcm_mmap_begin error: %s",
state->props.device, snd_strerror(res)); state->name, snd_strerror(res));
alsa_recover(state, res); alsa_recover(state, res);
return res; return res;
} }
@ -2378,13 +2378,13 @@ again:
if (state->use_mmap && written > 0) { if (state->use_mmap && written > 0) {
if (SPA_UNLIKELY((commitres = snd_pcm_mmap_commit(hndl, offset, written)) < 0)) { if (SPA_UNLIKELY((commitres = snd_pcm_mmap_commit(hndl, offset, written)) < 0)) {
spa_log_error(state->log, "%s: snd_pcm_mmap_commit error: %s", spa_log_error(state->log, "%s: snd_pcm_mmap_commit error: %s",
state->props.device, snd_strerror(commitres)); state->name, snd_strerror(commitres));
if (commitres != -EPIPE && commitres != -ESTRPIPE) if (commitres != -EPIPE && commitres != -ESTRPIPE)
return res; return res;
} }
if (commitres > 0 && written != (snd_pcm_uframes_t) commitres) { if (commitres > 0 && written != (snd_pcm_uframes_t) commitres) {
spa_log_warn(state->log, "%s: mmap_commit wrote %ld instead of %ld", spa_log_warn(state->log, "%s: mmap_commit wrote %ld instead of %ld",
state->props.device, commitres, written); state->name, commitres, written);
} }
} }
@ -2421,7 +2421,7 @@ push_frames(struct state *state,
snd_pcm_uframes_t total_frames = 0; snd_pcm_uframes_t total_frames = 0;
if (spa_list_is_empty(&state->free)) { if (spa_list_is_empty(&state->free)) {
spa_log_warn(state->log, "%s: no more buffers", state->props.device); spa_log_warn(state->log, "%s: no more buffers", state->name);
total_frames = frames; total_frames = frames;
} else { } else {
size_t n_bytes, left, frame_size = state->frame_size; size_t n_bytes, left, frame_size = state->frame_size;
@ -2520,7 +2520,7 @@ int spa_alsa_read(struct state *state)
if ((suppressed = spa_ratelimit_test(&state->rate_limit, current_time)) >= 0) { if ((suppressed = spa_ratelimit_test(&state->rate_limit, current_time)) >= 0) {
spa_log_lev(state->log, lev, "%s: follower delay:%ld target:%ld thr:%u, " spa_log_lev(state->log, lev, "%s: follower delay:%ld target:%ld thr:%u, "
"resync (%d suppressed)", state->props.device, delay, "resync (%d suppressed)", state->name, delay,
target, state->threshold, suppressed); target, state->threshold, suppressed);
} }
@ -2544,7 +2544,7 @@ int spa_alsa_read(struct state *state)
to_read = state->buffer_frames; to_read = state->buffer_frames;
if ((res = snd_pcm_mmap_begin(hndl, &my_areas, &offset, &to_read)) < 0) { if ((res = snd_pcm_mmap_begin(hndl, &my_areas, &offset, &to_read)) < 0) {
spa_log_error(state->log, "%s: snd_pcm_mmap_begin error: %s", spa_log_error(state->log, "%s: snd_pcm_mmap_begin error: %s",
state->props.device, snd_strerror(res)); state->name, snd_strerror(res));
alsa_recover(state, res); alsa_recover(state, res);
return res; return res;
} }
@ -2569,13 +2569,13 @@ int spa_alsa_read(struct state *state)
offset, read, state->sample_count); offset, read, state->sample_count);
if ((commitres = snd_pcm_mmap_commit(hndl, offset, read)) < 0) { if ((commitres = snd_pcm_mmap_commit(hndl, offset, read)) < 0) {
spa_log_error(state->log, "%s: snd_pcm_mmap_commit error %lu %lu: %s", spa_log_error(state->log, "%s: snd_pcm_mmap_commit error %lu %lu: %s",
state->props.device, frames, read, snd_strerror(commitres)); state->name, frames, read, snd_strerror(commitres));
if (commitres != -EPIPE && commitres != -ESTRPIPE) if (commitres != -EPIPE && commitres != -ESTRPIPE)
return res; return res;
} }
if (commitres > 0 && read != (snd_pcm_uframes_t) commitres) { if (commitres > 0 && read != (snd_pcm_uframes_t) commitres) {
spa_log_warn(state->log, "%s: mmap_commit read %ld instead of %ld", spa_log_warn(state->log, "%s: mmap_commit read %ld instead of %ld",
state->props.device, commitres, read); state->name, commitres, read);
} }
} }
@ -2591,7 +2591,7 @@ int spa_alsa_skip(struct state *state)
uint32_t i, avail, total_frames, n_bytes, frames; uint32_t i, avail, total_frames, n_bytes, frames;
if (spa_list_is_empty(&state->free)) { if (spa_list_is_empty(&state->free)) {
spa_log_warn(state->log, "%s: no more buffers", state->props.device); spa_log_warn(state->log, "%s: no more buffers", state->name);
return -EPIPE; return -EPIPE;
} }
@ -2775,7 +2775,7 @@ done:
if ((suppressed = spa_ratelimit_test(&state->rate_limit, current_time)) >= 0) { if ((suppressed = spa_ratelimit_test(&state->rate_limit, current_time)) >= 0) {
spa_log_error(state->log, "%s: impossible timeout %lu %lu %lu %" spa_log_error(state->log, "%s: impossible timeout %lu %lu %lu %"
PRIu64" %"PRIu64" %"PRIi64" %d %"PRIi64" (%d suppressed)", PRIu64" %"PRIu64" %"PRIi64" %d %"PRIi64" (%d suppressed)",
state->props.device, avail, delay, target, state->name, avail, delay, target,
current_time, state->next_time, state->next_time - current_time, current_time, state->next_time, state->next_time - current_time,
state->threshold, state->sample_count, suppressed); state->threshold, state->sample_count, suppressed);
} }
@ -2871,7 +2871,7 @@ int spa_alsa_start(struct state *state)
state->following = is_following(state); state->following = is_following(state);
if (check_position_config(state) < 0) { if (check_position_config(state) < 0) {
spa_log_error(state->log, "%s: invalid position config", state->props.device); spa_log_error(state->log, "%s: invalid position config", state->name);
return -EIO; return -EIO;
} }
@ -2888,7 +2888,7 @@ int spa_alsa_start(struct state *state)
if ((err = snd_pcm_prepare(state->hndl)) < 0 && err != -EBUSY) { if ((err = snd_pcm_prepare(state->hndl)) < 0 && err != -EBUSY) {
spa_log_error(state->log, "%s: snd_pcm_prepare error: %s", spa_log_error(state->log, "%s: snd_pcm_prepare error: %s",
state->props.device, snd_strerror(err)); state->name, snd_strerror(err));
return err; return err;
} }
@ -3017,7 +3017,7 @@ int spa_alsa_pause(struct state *state)
spa_loop_invoke(state->data_loop, do_remove_source, 0, NULL, 0, true, state); spa_loop_invoke(state->data_loop, do_remove_source, 0, NULL, 0, true, state);
if ((err = snd_pcm_drop(state->hndl)) < 0) if ((err = snd_pcm_drop(state->hndl)) < 0)
spa_log_error(state->log, "%s: snd_pcm_drop %s", state->props.device, spa_log_error(state->log, "%s: snd_pcm_drop %s", state->name,
snd_strerror(err)); snd_strerror(err));
state->started = false; state->started = false;

View file

@ -97,6 +97,7 @@ struct state {
struct card *card; struct card *card;
snd_pcm_stream_t stream; snd_pcm_stream_t stream;
snd_output_t *output; snd_output_t *output;
char name[64];
struct spa_hook_list hooks; struct spa_hook_list hooks;
struct spa_callbacks callbacks; struct spa_callbacks callbacks;