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