8 /* VICE code: Store number as little endian. */
9 static void le_store (uint8_t *buf, uint32_t val, int len)
12 for (i = 0; i < len; i++) {
13 buf[i] = (uint8_t) (val & 0xff);
18 static void wav_state_cb (void *opaque, int enabled)
20 WAVState *wav = opaque;
25 uint32_t datalen = wav->bytes;
26 uint32_t rifflen = datalen + 36;
32 le_store (rlen, rifflen, 4);
33 le_store (dlen, datalen, 4);
35 qemu_fseek (wav->f, 4, SEEK_SET);
36 qemu_put_buffer (wav->f, rlen, 4);
38 qemu_fseek (wav->f, 32, SEEK_CUR);
39 qemu_put_buffer (wav->f, dlen, 4);
42 qemu_fseek (wav->f, 0, SEEK_END);
46 static void wav_capture_cb (void *opaque, void *buf, int size)
48 WAVState *wav = opaque;
50 qemu_put_buffer (wav->f, buf, size);
54 void wav_capture (const char *path, int freq, int bits16, int stereo)
58 0x52, 0x49, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56,
59 0x45, 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
60 0x02, 0x00, 0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04,
61 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00
64 struct audio_capture_ops ops;
71 as.nchannels = 1 << stereo;
72 as.fmt = bits16 ? AUD_FMT_S16 : AUD_FMT_U8;
74 ops.state = wav_state_cb;
75 ops.capture = wav_capture_cb;
77 wav = qemu_mallocz (sizeof (*wav));
79 AUD_log ("wav", "Could not allocate memory (%zu bytes)", sizeof (*wav));
83 shift = bits16 + stereo;
84 hdr[34] = bits16 ? 0x10 : 0x08;
86 le_store (hdr + 22, as.nchannels, 2);
87 le_store (hdr + 24, freq, 4);
88 le_store (hdr + 28, freq << shift, 4);
89 le_store (hdr + 32, 1 << shift, 2);
91 wav->f = fopen (path, "wb");
93 AUD_log ("wav", "Failed to open wave file `%s'\nReason: %s\n",
94 path, strerror (errno));
99 qemu_put_buffer (wav->f, hdr, sizeof (hdr));
100 AUD_add_capture (NULL, &as, 0, &ops, wav);