"channels=<number of channels> "
"channel_map=<channel map>"
"fragments=<number of fragments> "
- "fragment_size=<fragment size> ");
+ "fragment_size=<fragment size> "
+ "block_msec=<sink keep> "
+ "max_request_msec=<maximum buffer request of device> ");
#define DEFAULT_SINK_NAME "tizenaudio-sink"
-/* BLOCK_USEC should be less than amount of fragment_size * fragments */
-#define BLOCK_USEC (PA_USEC_PER_SEC * 0.064)
+/* block_usec should be less than amount of fragment_size * fragments */
+#define DEFAULT_BLOCK_USEC (PA_USEC_PER_SEC * 0.05)
+
+/* Sink device consumes that amount of maximum buffer at every request */
+#define DEFAULT_MAX_REQUEST_USEC (PA_USEC_PER_SEC * 0.032)
struct userdata {
pa_core *core;
uint32_t frag_size;
pa_usec_t block_usec;
+ pa_usec_t max_request_usec;
pa_usec_t timestamp;
pa_usec_t timestamp_written;
"channel_map",
"fragments",
"fragment_size",
+ "block_msec",
+ "max_request_msec",
NULL
};
static void sink_update_requested_latency_cb(pa_sink *s) {
struct userdata *u;
- size_t nbytes;
pa_sink_assert_ref(s);
pa_assert_se(u = s->userdata);
if (u->block_usec == (pa_usec_t)-1)
u->block_usec = s->thread_info.max_latency;
- nbytes = pa_usec_to_bytes(u->block_usec, &s->sample_spec);
- pa_sink_set_max_rewind_within_thread(s, nbytes);
- pa_sink_set_max_request_within_thread(s, nbytes / 2); /* max_request 32ms seems enough */
+ pa_sink_set_max_rewind_within_thread(s, pa_usec_to_bytes(u->block_usec, &s->sample_spec));
+ pa_sink_set_max_request_within_thread(s, pa_usec_to_bytes(u->max_request_usec, &s->sample_spec));
}
static void process_rewind(struct userdata *u, pa_usec_t now) {
if (u->first) {
pa_log_debug("Fill initial buffer");
- frames_to_write = (u->frag_size * u->nfrags) / frame_size;
+ frames_to_write = pa_usec_to_bytes(u->block_usec, &u->sink->sample_spec) / frame_size;
u->timestamp = u->timestamp_written = now;
} else {
/* Write pcm every 10ms */
pa_channel_map map;
pa_modargs *ma = NULL;
pa_sink_new_data data;
- size_t nbytes;
uint32_t alternate_sample_rate;
+ uint32_t block_msec;
+ uint32_t max_request_msec;
pa_assert(m);
}
pa_log_info("fragment_size(%u), fragments(%u)", u->frag_size, u->nfrags);
+ /* Optional */
+ block_msec = DEFAULT_BLOCK_USEC / PA_USEC_PER_MSEC;
+ pa_modargs_get_value_u32(ma, "block_msec", &block_msec);
+ u->block_usec = (pa_usec_t) block_msec * PA_USEC_PER_MSEC;
+
+ /* Optional */
+ max_request_msec = DEFAULT_MAX_REQUEST_USEC / PA_USEC_PER_MSEC;
+ pa_modargs_get_value_u32(ma, "max_request_msec", &max_request_msec);
+ u->max_request_usec = (pa_usec_t) max_request_msec * PA_USEC_PER_MSEC;
+
+ u->timestamp = 0ULL;
+ u->timestamp_written = 0ULL;
+
pa_sink_new_data_init(&data);
data.driver = __FILE__;
data.module = m;
pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
pa_sink_set_rtpoll(u->sink, u->rtpoll);
- u->block_usec = BLOCK_USEC;
- u->timestamp = 0ULL;
- u->timestamp_written = 0ULL;
-
- nbytes = pa_usec_to_bytes(u->block_usec, &u->sink->sample_spec);
pa_sink_set_max_rewind(u->sink, 0);
- pa_sink_set_max_request(u->sink, nbytes / 2); /* max_request 32ms seems enough */
+ pa_sink_set_max_request(u->sink, pa_usec_to_bytes(u->max_request_usec, &u->sink->sample_spec));
if (!(u->thread = pa_thread_new("tizenaudio-sink", thread_func, u))) {
pa_log_error("Failed to create thread.");