Statistics
| Branch: | Revision:

root / audio / audio_win_int.c @ 997aba8e

History | View | Annotate | Download (2.3 kB)

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