Statistics
| Branch: | Revision:

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
}