int bytes_per_frame;
};
+/*
+ * We keep one bit of static storage to make sure only one instance of the oss
+ * writer is running at any given time.
+ */
+static bool sound_device_busy;
+
+static bool sound_device_is_busy(void)
+{
+ return sound_device_busy;
+}
+
+static void set_sound_device_busy(void)
+{
+ assert(!sound_device_busy);
+ sound_device_busy = true;
+}
+
+static void set_sound_device_idle(void)
+{
+ assert(sound_device_busy);
+ sound_device_busy = false;
+}
+
static int get_oss_format(enum sample_format sf)
{
switch (sf) {
struct private_oss_write_data *powd = wn->private_data;
int ret = btr_node_status(wn->btrn, wn->min_iqs, BTR_NT_LEAF);
- if (ret == 0)
+ if (ret == 0 || (sound_device_is_busy() && !powd))
return;
if (ret < 0 || !powd)
return sched_min_delay(s);
return;
close(powd->fd);
free(powd);
+ set_sound_device_idle();
}
/*
goto out;
if (!powd) {
int32_t rate, ch, format;
+
+ if (sound_device_is_busy())
+ return 0;
get_btr_sample_rate(btrn, &rate);
get_btr_channels(btrn, &ch);
get_btr_sample_format(btrn, &format);
ret = oss_init(wn, rate, ch, format);
if (ret < 0)
goto out;
+ set_sound_device_busy();
return 0;
}
btr_merge(btrn, wn->min_iqs);