Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging
[qemu.git] / audio / audio_win_int.c
1 /* public domain */
2
3 #include "qemu-common.h"
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