2 * Copyright (C) 2005-2012 Andre Noll <maan@systemlinux.org>
4 * Licensed under the GPL v2. For licencing details see COPYING.
7 /** \file wav_filter.c A filter that inserts a wave header. */
16 #include "buffer_tree.h"
19 #include "portable_io.h"
21 /** A wav header is always 44 bytes. */
22 #define WAV_HEADER_LEN 44
23 /** Always write 16 bit header. */
26 static void make_wav_header(unsigned int channels
, unsigned int sample_rate
,
30 unsigned int size
= 0x7fffffff;
31 int bytespersec
= channels
* sample_rate
* BITS
/ 8;
32 int align
= channels
* BITS
/ 8;
34 PARA_DEBUG_LOG("writing wave header: %d channels, %d KHz\n", channels
, sample_rate
);
35 memset(headbuf
, 0, WAV_HEADER_LEN
);
36 memcpy(headbuf
, "RIFF", 4);
37 write_u32(headbuf
+ 4, size
- 8);
38 memcpy(headbuf
+ 8, "WAVE", 4);
39 memcpy(headbuf
+ 12, "fmt ", 4);
40 write_u32(headbuf
+ 16, 16); /* 16 + extra format bytes (zero) */
41 write_u16(headbuf
+ 20, 1); /* format (1 == PCM/uncompressed) */
42 write_u16(headbuf
+ 22, channels
);
43 write_u32(headbuf
+ 24, sample_rate
);
44 write_u32(headbuf
+ 28, bytespersec
);
45 write_u16(headbuf
+ 32, align
); /* number of bytes per sample slice */
46 write_u16(headbuf
+ 34, BITS
); /* significant bits per sample */
47 memcpy(headbuf
+ 36, "data", 4); /* chunk ID */
48 write_u32(headbuf
+ 40, size
- 44); /* chunk size */
51 static void wav_close(struct filter_node
*fn
)
53 free(fn
->private_data
);
54 fn
->private_data
= NULL
;
57 static void wav_open(struct filter_node
*fn
)
61 fn
->private_data
= para_malloc(sizeof(int));
62 bof
= fn
->private_data
;
66 static void wav_pre_select(struct sched
*s
, struct task
*t
)
68 struct filter_node
*fn
= container_of(t
, struct filter_node
, task
);
69 size_t iqs
= btr_get_input_queue_size(fn
->btrn
);
77 static void wav_post_select(__a_unused
struct sched
*s
, struct task
*t
)
79 struct filter_node
*fn
= container_of(t
, struct filter_node
, task
);
80 struct btr_node
*btrn
= fn
->btrn
;
81 size_t iqs
= btr_get_input_queue_size(btrn
);
89 if (btr_no_parent(btrn
))
93 ret
= btr_exec_up(btrn
, "sample_rate", &buf
);
98 ret
= para_atoi32(buf
, &rate
);
102 ret
= btr_exec_up(btrn
, "channels", &buf
);
107 ret
= para_atoi32(buf
, &ch
);
111 header
= para_malloc(WAV_HEADER_LEN
);
112 make_wav_header(ch
, rate
, header
);
113 btr_add_output(header
, WAV_HEADER_LEN
, btrn
);
114 ret
= -E_WAV_SUCCESS
;
117 if (ret
== -E_WAV_SUCCESS
)
118 btr_splice_out_node(btrn
);
120 btr_remove_node(btrn
);
121 PARA_ERROR_LOG("%s\n", para_strerror(-ret
));
126 * The init function of the wav filter.
128 * \param f Structure to initialize.
130 void wav_filter_init(struct filter
*f
)
132 f
->close
= wav_close
;
134 f
->pre_select
= wav_pre_select
;
135 f
->post_select
= wav_post_select
;