15 /* VICE code: Store number as little endian. */
16 static void le_store (uint8_t *buf, uint32_t val, int len)
19 for (i = 0; i < len; i++) {
20 buf[i] = (uint8_t) (val & 0xff);
25 static void wav_notify (void *opaque, audcnotification_e cmd)
31 static void wav_destroy (void *opaque)
33 WAVState *wav = opaque;
36 uint32_t datalen = wav->bytes;
37 uint32_t rifflen = datalen + 36;
40 le_store (rlen, rifflen, 4);
41 le_store (dlen, datalen, 4);
43 qemu_fseek (wav->f, 4, SEEK_SET);
44 qemu_put_buffer (wav->f, rlen, 4);
46 qemu_fseek (wav->f, 32, SEEK_CUR);
47 qemu_put_buffer (wav->f, dlen, 4);
51 qemu_free (wav->path);
54 static void wav_capture (void *opaque, void *buf, int size)
56 WAVState *wav = opaque;
58 qemu_put_buffer (wav->f, buf, size);
62 static void wav_capture_destroy (void *opaque)
64 WAVState *wav = opaque;
66 AUD_del_capture (wav->cap, wav);
69 static void wav_capture_info (void *opaque)
71 WAVState *wav = opaque;
72 char *path = wav->path;
74 term_printf ("Capturing audio(%d,%d,%d) to %s: %d bytes\n",
75 wav->freq, wav->bits, wav->nchannels,
76 path ? path : "<not available>", wav->bytes);
79 static struct capture_ops wav_capture_ops = {
80 .destroy = wav_capture_destroy,
81 .info = wav_capture_info
84 int wav_start_capture (CaptureState *s, const char *path, int freq,
85 int bits, int nchannels)
89 0x52, 0x49, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56,
90 0x45, 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
91 0x02, 0x00, 0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04,
92 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00
95 struct audio_capture_ops ops;
96 int stereo, bits16, shift;
99 if (bits != 8 && bits != 16) {
100 term_printf ("incorrect bit count %d, must be 8 or 16\n", bits);
104 if (nchannels != 1 && nchannels != 2) {
105 term_printf ("incorrect channel count %d, must be 1 or 2\n",
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 term_printf ("Could not allocate memory for wav capture (%zu bytes)",
129 shift = bits16 + stereo;
130 hdr[34] = bits16 ? 0x10 : 0x08;
132 le_store (hdr + 22, as.nchannels, 2);
133 le_store (hdr + 24, freq, 4);
134 le_store (hdr + 28, freq << shift, 4);
135 le_store (hdr + 32, 1 << shift, 2);
137 wav->f = qemu_fopen (path, "wb");
139 term_printf ("Failed to open wave file `%s'\nReason: %s\n",
140 path, strerror (errno));
145 wav->path = qemu_strdup (path);
147 wav->nchannels = nchannels;
150 qemu_put_buffer (wav->f, hdr, sizeof (hdr));
152 cap = AUD_add_capture (NULL, &as, &ops, wav);
154 term_printf ("Failed to add audio capture\n");
155 qemu_free (wav->path);
156 qemu_fclose (wav->f);
163 s->ops = wav_capture_ops;