13 /* VICE code: Store number as little endian. */
14 static void le_store (uint8_t *buf, uint32_t val, int len)
17 for (i = 0; i < len; i++) {
18 buf[i] = (uint8_t) (val & 0xff);
23 static void wav_notify (void *opaque, audcnotification_e cmd)
29 static void wav_destroy (void *opaque)
31 WAVState *wav = opaque;
34 uint32_t datalen = wav->bytes;
35 uint32_t rifflen = datalen + 36;
41 le_store (rlen, rifflen, 4);
42 le_store (dlen, datalen, 4);
44 qemu_fseek (wav->f, 4, SEEK_SET);
45 qemu_put_buffer (wav->f, rlen, 4);
47 qemu_fseek (wav->f, 32, SEEK_CUR);
48 qemu_put_buffer (wav->f, dlen, 4);
51 qemu_free (wav->path);
55 static void wav_capture (void *opaque, void *buf, int size)
57 WAVState *wav = opaque;
59 qemu_put_buffer (wav->f, buf, size);
63 static void wav_capture_destroy (void *opaque)
65 WAVState *wav = opaque;
67 AUD_del_capture (wav->cap, wav);
70 static void wav_capture_info (void *opaque)
72 WAVState *wav = opaque;
73 char *path = wav->path;
75 term_printf ("Capturing audio(%d,%d,%d) to %s: %d bytes\n",
76 wav->freq, wav->bits, wav->nchannels,
77 path ? path : "<not available>", wav->bytes);
80 static struct capture_ops wav_capture_ops = {
81 .destroy = wav_capture_destroy,
82 .info = wav_capture_info
85 int wav_start_capture (CaptureState *s, const char *path, int freq,
86 int bits, int nchannels)
90 0x52, 0x49, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56,
91 0x45, 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
92 0x02, 0x00, 0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04,
93 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00
96 struct audio_capture_ops ops;
97 int stereo, bits16, shift;
100 if (bits != 8 && bits != 16) {
101 term_printf ("incorrect bit count %d, must be 8 or 16\n", bits);
105 if (nchannels != 1 && nchannels != 2) {
106 term_printf ("incorrect channel count %d, must be 1 or 2\n", bits);
110 stereo = nchannels == 2;
114 as.nchannels = 1 << stereo;
115 as.fmt = bits16 ? AUD_FMT_S16 : AUD_FMT_U8;
118 ops.notify = wav_notify;
119 ops.capture = wav_capture;
120 ops.destroy = wav_destroy;
122 wav = qemu_mallocz (sizeof (*wav));
124 AUD_log ("wav", "Could not allocate memory (%zu bytes)", sizeof (*wav));
128 shift = bits16 + stereo;
129 hdr[34] = bits16 ? 0x10 : 0x08;
131 le_store (hdr + 22, as.nchannels, 2);
132 le_store (hdr + 24, freq, 4);
133 le_store (hdr + 28, freq << shift, 4);
134 le_store (hdr + 32, 1 << shift, 2);
136 wav->f = fopen (path, "wb");
138 term_printf ("Failed to open wave file `%s'\nReason: %s\n",
139 path, strerror (errno));
144 wav->path = qemu_strdup (path);
146 wav->nchannels = nchannels;
149 qemu_put_buffer (wav->f, hdr, sizeof (hdr));
151 cap = AUD_add_capture (NULL, &as, &ops, wav);
153 term_printf ("Failed to add audio capture\n");
160 s->ops = wav_capture_ops;