"rate=<sample rate> "
"buffer_length=<milliseconds> "
"channel_map=<channel map>");
-PA_MODULE_LOAD_ONCE(FALSE);
+PA_MODULE_LOAD_ONCE(false);
struct userdata {
pa_core *core;
pa_rtpoll_item *rtpoll_item;
pa_module *module;
- pa_bool_t sink_suspended, source_suspended;
+ bool sink_suspended, source_suspended;
uint32_t play_samples_msw, record_samples_msw;
uint32_t prev_playback_samples, prev_record_samples;
pa_smoother_put(u->smoother, pa_rtclock_now(), pa_bytes_to_usec(played_bytes, &u->sink->sample_spec));
- return u->written_bytes - played_bytes;
+ if (u->written_bytes > played_bytes)
+ return u->written_bytes - played_bytes;
+ else
+ return 0;
}
static pa_usec_t sink_get_latency(struct userdata *u, pa_sample_spec *ss) {
pa_log_info("Suspending...");
- ioctl(u->fd, AUDIO_DRAIN, NULL);
+ ioctl(u->fd, I_FLUSH, FLUSHRW);
pa_close(u->fd);
u->fd = -1;
if (suspend(u) < 0)
return -1;
}
- u->sink_suspended = TRUE;
+ u->sink_suspended = true;
break;
case PA_SINK_IDLE:
case PA_SINK_RUNNING:
if (u->sink->thread_info.state == PA_SINK_SUSPENDED) {
- pa_smoother_resume(u->smoother, pa_rtclock_now(), TRUE);
+ pa_smoother_resume(u->smoother, pa_rtclock_now(), true);
if (!u->source || u->source_suspended) {
if (unsuspend(u) < 0)
u->sink->get_volume(u->sink);
u->sink->get_mute(u->sink);
}
- u->sink_suspended = FALSE;
+ u->sink_suspended = false;
}
break;
if (suspend(u) < 0)
return -1;
}
- u->source_suspended = TRUE;
+ u->source_suspended = true;
break;
case PA_SOURCE_IDLE:
return -1;
u->source->get_volume(u->source);
}
- u->source_suspended = FALSE;
+ u->source_suspended = false;
}
break;
if (u->fd >= 0) {
AUDIO_INITINFO(&info);
- info.play.gain = pa_cvolume_max(&s->volume) * AUDIO_MAX_GAIN / PA_VOLUME_NORM;
+ info.play.gain = pa_cvolume_max(&s->real_volume) * AUDIO_MAX_GAIN / PA_VOLUME_NORM;
assert(info.play.gain <= AUDIO_MAX_GAIN);
if (ioctl(u->fd, AUDIO_SETINFO, &info) < 0) {
if (ioctl(u->fd, AUDIO_GETINFO, &info) < 0)
pa_log("AUDIO_SETINFO: %s", pa_cstrerror(errno));
else
- pa_cvolume_set(&s->volume, s->sample_spec.channels, info.play.gain * PA_VOLUME_NORM / AUDIO_MAX_GAIN);
+ pa_cvolume_set(&s->real_volume, s->sample_spec.channels, info.play.gain * PA_VOLUME_NORM / AUDIO_MAX_GAIN);
}
}
if (u->fd >= 0) {
AUDIO_INITINFO(&info);
- info.output_muted = !!s->muted;
+ info.output_muted = s->muted;
if (ioctl(u->fd, AUDIO_SETINFO, &info) < 0)
pa_log("AUDIO_SETINFO: %s", pa_cstrerror(errno));
}
}
-static void sink_get_mute(pa_sink *s) {
+static int sink_get_mute(pa_sink *s, bool *mute) {
struct userdata *u = s->userdata;
audio_info_t info;
pa_assert(u);
- if (u->fd >= 0) {
- if (ioctl(u->fd, AUDIO_GETINFO, &info) < 0)
- pa_log("AUDIO_SETINFO: %s", pa_cstrerror(errno));
- else
- s->muted = !!info.output_muted;
+ if (u->fd < 0)
+ return -1;
+
+ if (ioctl(u->fd, AUDIO_GETINFO, &info) < 0) {
+ pa_log("AUDIO_GETINFO: %s", pa_cstrerror(errno));
+ return -1;
}
+
+ *mute = info.output_muted;
+
+ return 0;
}
static void process_rewind(struct userdata *u) {
pa_assert(u);
- /* Figure out how much we shall rewind and reset the counter */
+ if (!PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
+ pa_sink_process_rewind(u->sink, 0);
+ return;
+ }
+
rewind_nbytes = u->sink->thread_info.rewind_nbytes;
- u->sink->thread_info.rewind_nbytes = 0;
if (rewind_nbytes > 0) {
pa_log_debug("Requested to rewind %lu bytes.", (unsigned long) rewind_nbytes);
for (;;) {
/* Render some data and write it to the dsp */
+ if (PA_UNLIKELY(u->sink->thread_info.rewind_requested))
+ process_rewind(u);
+
if (u->sink && PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
pa_usec_t xtime0, ysleep_interval, xsleep_interval;
uint64_t buffered_bytes;
- if (u->sink->thread_info.rewind_requested)
- process_rewind(u);
-
err = ioctl(u->fd, AUDIO_GETINFO, &info);
if (err < 0) {
pa_log("AUDIO_GETINFO ioctl failed: %s", pa_cstrerror(errno));
if (ioctl(u->fd, AUDIO_SETINFO, &info) < 0)
pa_log("AUDIO_SETINFO: %s", pa_cstrerror(errno));
- pa_smoother_reset(u->smoother, pa_rtclock_now(), TRUE);
+ pa_smoother_reset(u->smoother, pa_rtclock_now(), true);
}
for (;;) {
}
/* Hmm, nothing to do. Let's sleep */
- if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0)
+ if ((ret = pa_rtpoll_run(u->rtpoll, true)) < 0)
goto fail;
if (ret == 0)
pa_log_debug("caught signal");
if (u->sink) {
- pa_sink_get_volume(u->sink, TRUE);
- pa_sink_get_mute(u->sink, TRUE);
+ pa_sink_get_volume(u->sink, true);
+ pa_sink_get_mute(u->sink, true);
}
if (u->source)
- pa_source_get_volume(u->source, TRUE);
+ pa_source_get_volume(u->source, true);
}
int pa__init(pa_module *m) {
struct userdata *u = NULL;
- pa_bool_t record = TRUE, playback = TRUE;
+ bool record = true, playback = true;
pa_sample_spec ss;
pa_channel_map map;
pa_modargs *ma = NULL;
pa_source_new_data source_new_data;
char const *name;
char *name_buf;
- pa_bool_t namereg_fail;
+ bool namereg_fail;
pa_assert(m);
u = pa_xnew0(struct userdata, 1);
- if (!(u->smoother = pa_smoother_new(PA_USEC_PER_SEC, PA_USEC_PER_SEC * 2, TRUE, TRUE, 10, pa_rtclock_now(), TRUE)))
+ if (!(u->smoother = pa_smoother_new(PA_USEC_PER_SEC, PA_USEC_PER_SEC * 2, true, true, 10, pa_rtclock_now(), true)))
goto fail;
/*
if (u->mode != O_WRONLY) {
name_buf = NULL;
- namereg_fail = TRUE;
+ namereg_fail = true;
if (!(name = pa_modargs_get_value(ma, "source_name", NULL))) {
name = name_buf = pa_sprintf_malloc("solaris_input.%s", pa_path_get_filename(u->device_name));
- namereg_fail = FALSE;
+ namereg_fail = false;
}
pa_source_new_data_init(&source_new_data);
pa_source_set_get_volume_callback(u->source, source_get_volume);
pa_source_set_set_volume_callback(u->source, source_set_volume);
- u->source->refresh_volume = TRUE;
+ u->source->refresh_volume = true;
} else
u->source = NULL;
if (u->mode != O_RDONLY) {
name_buf = NULL;
- namereg_fail = TRUE;
+ namereg_fail = true;
if (!(name = pa_modargs_get_value(ma, "sink_name", NULL))) {
name = name_buf = pa_sprintf_malloc("solaris_output.%s", pa_path_get_filename(u->device_name));
- namereg_fail = FALSE;
+ namereg_fail = false;
}
pa_sink_new_data_init(&sink_new_data);
pa_sink_set_set_volume_callback(u->sink, sink_set_volume);
pa_sink_set_get_mute_callback(u->sink, sink_get_mute);
pa_sink_set_set_mute_callback(u->sink, sink_set_mute);
- u->sink->refresh_volume = u->sink->refresh_muted = TRUE;
+ u->sink->refresh_volume = u->sink->refresh_muted = true;
} else
u->sink = NULL;