]>
Commit | Line | Data |
---|---|---|
d5631638 | 1 | /* public domain */ |
2 | ||
3 | #include "qemu-common.h" | |
d5631638 | 4 | |
5 | #define AUDIO_CAP "win-int" | |
6 | #include <windows.h> | |
7 | #include <mmsystem.h> | |
8 | ||
9 | #include "audio.h" | |
10 | #include "audio_int.h" | |
11 | #include "audio_win_int.h" | |
12 | ||
13 | int waveformat_from_audio_settings (WAVEFORMATEX *wfx, | |
14 | struct audsettings *as) | |
15 | { | |
16 | memset (wfx, 0, sizeof (*wfx)); | |
17 | ||
18 | wfx->wFormatTag = WAVE_FORMAT_PCM; | |
19 | wfx->nChannels = as->nchannels; | |
20 | wfx->nSamplesPerSec = as->freq; | |
21 | wfx->nAvgBytesPerSec = as->freq << (as->nchannels == 2); | |
22 | wfx->nBlockAlign = 1 << (as->nchannels == 2); | |
23 | wfx->cbSize = 0; | |
24 | ||
25 | switch (as->fmt) { | |
26 | case AUD_FMT_S8: | |
27 | case AUD_FMT_U8: | |
28 | wfx->wBitsPerSample = 8; | |
29 | break; | |
30 | ||
31 | case AUD_FMT_S16: | |
32 | case AUD_FMT_U16: | |
33 | wfx->wBitsPerSample = 16; | |
34 | wfx->nAvgBytesPerSec <<= 1; | |
35 | wfx->nBlockAlign <<= 1; | |
36 | break; | |
37 | ||
38 | case AUD_FMT_S32: | |
39 | case AUD_FMT_U32: | |
40 | wfx->wBitsPerSample = 32; | |
41 | wfx->nAvgBytesPerSec <<= 2; | |
42 | wfx->nBlockAlign <<= 2; | |
43 | break; | |
44 | ||
45 | default: | |
46 | dolog ("Internal logic error: Bad audio format %d\n", as->freq); | |
47 | return -1; | |
48 | } | |
49 | ||
50 | return 0; | |
51 | } | |
52 | ||
53 | int waveformat_to_audio_settings (WAVEFORMATEX *wfx, | |
54 | struct audsettings *as) | |
55 | { | |
56 | if (wfx->wFormatTag != WAVE_FORMAT_PCM) { | |
57 | dolog ("Invalid wave format, tag is not PCM, but %d\n", | |
58 | wfx->wFormatTag); | |
59 | return -1; | |
60 | } | |
61 | ||
62 | if (!wfx->nSamplesPerSec) { | |
63 | dolog ("Invalid wave format, frequency is zero\n"); | |
64 | return -1; | |
65 | } | |
66 | as->freq = wfx->nSamplesPerSec; | |
67 | ||
68 | switch (wfx->nChannels) { | |
69 | case 1: | |
70 | as->nchannels = 1; | |
71 | break; | |
72 | ||
73 | case 2: | |
74 | as->nchannels = 2; | |
75 | break; | |
76 | ||
77 | default: | |
78 | dolog ( | |
79 | "Invalid wave format, number of channels is not 1 or 2, but %d\n", | |
80 | wfx->nChannels | |
81 | ); | |
82 | return -1; | |
83 | } | |
84 | ||
85 | switch (wfx->wBitsPerSample) { | |
86 | case 8: | |
87 | as->fmt = AUD_FMT_U8; | |
88 | break; | |
89 | ||
90 | case 16: | |
91 | as->fmt = AUD_FMT_S16; | |
92 | break; | |
93 | ||
94 | case 32: | |
95 | as->fmt = AUD_FMT_S32; | |
96 | break; | |
97 | ||
98 | default: | |
99 | dolog ("Invalid wave format, bits per sample is not " | |
100 | "8, 16 or 32, but %d\n", | |
101 | wfx->wBitsPerSample); | |
102 | return -1; | |
103 | } | |
104 | ||
105 | return 0; | |
106 | } | |
107 |