-static struct check_wav_task the_check_wav_task;
-static struct initial_delay_task the_initial_delay_task;
-
-static struct writer_node_group *wng;
-
-/** Length of a standard wav header. */
-#define WAV_HEADER_LEN 44
-
-/**
- * Test if audio buffer contains a valid wave header.
- *
- * \return If not, return -E_NO_WAV_HEADER, otherwise, return zero. If
- * there is less than WAV_HEADER_LEN bytes available, return one.
- */
-static void check_wav_pre_select(__a_unused struct sched *s, struct task *t)
-{
- struct check_wav_task *cwt = container_of(t, struct check_wav_task, task);
- unsigned char *a;
- int ret;
-
- if (*cwt->loaded < WAV_HEADER_LEN) {
- if (*cwt->input_error < 0)
- t->error = *cwt->input_error;
- return;
- }
- cwt->channels = 2;
- cwt->samplerate = 44100;
- a = (unsigned char*)cwt->buf;
- if (a[0] != 'R' || a[1] != 'I' || a[2] != 'F' || a[3] != 'F') {
- PARA_NOTICE_LOG("wav header not found\n");
- t->error = -E_NO_WAV_HEADER;
- goto out;
- }
- cwt->channels = (unsigned) a[22];
- cwt->samplerate = a[24] + (a[25] << 8) + (a[26] << 16) + (a[27] << 24);
- *cwt->loaded -= WAV_HEADER_LEN;
- memmove(cwt->buf, cwt->buf + WAV_HEADER_LEN, *cwt->loaded);
- t->error = -E_WAV_HEADER_SUCCESS;
- PARA_INFO_LOG("channels: %d, sample rate: %d\n", cwt->channels, cwt->samplerate);
-out:
- wng->channels = &cwt->channels;
- wng->samplerate = &cwt->samplerate;
- ret = wng_open(wng);
- if (ret < 0)
- t->error = ret;
- s->timeout.tv_sec = 0;
- s->timeout.tv_usec = 1;
-}
-
-static void check_wav_pre_select_btr(__a_unused struct sched *s, struct task *t)
-{
- struct check_wav_task_btr *cwt = container_of(t, struct check_wav_task_btr, task);
-
- if (btr_get_input_queue_size(cwt->btrn) < WAV_HEADER_LEN)
- return;
- s->timeout.tv_sec = 0;
- s->timeout.tv_usec = 1;
-}
-
-static int check_wav_exec(struct btr_node *btrn, const char *cmd, char **result)
-{
- struct check_wav_task_btr *cwt = btr_context(btrn);
-
- if (!strcmp(cmd, "samplerate")) {
- if (cwt->state != CWS_HAVE_HEADER)
- return -ERRNO_TO_PARA_ERROR(ENAVAIL);
- *result = make_message("%d", cwt->samplerate);
- return 1;
- }
- if (!strcmp(cmd, "channels")) {
- if (cwt->state != CWS_HAVE_HEADER)
- return -ERRNO_TO_PARA_ERROR(ENAVAIL);
- *result = make_message("%d", cwt->samplerate);
- return 1;
- }
- return -ERRNO_TO_PARA_ERROR(ENOTSUP);
-}