Statistics
| Branch: | Revision:

root / audio / audio_win_int.c @ fd5723b3

History | View | Annotate | Download (2.3 kB)

1
/* public domain */
2

    
3
#include "qemu-common.h"
4
#include "audio.h"
5

    
6
#define AUDIO_CAP "win-int"
7
#include <windows.h>
8
#include <mmsystem.h>
9

    
10
#include "audio.h"
11
#include "audio_int.h"
12
#include "audio_win_int.h"
13

    
14
int waveformat_from_audio_settings (WAVEFORMATEX *wfx,
15
                                    struct audsettings *as)
16
{
17
    memset (wfx, 0, sizeof (*wfx));
18

    
19
    wfx->wFormatTag = WAVE_FORMAT_PCM;
20
    wfx->nChannels = as->nchannels;
21
    wfx->nSamplesPerSec = as->freq;
22
    wfx->nAvgBytesPerSec = as->freq << (as->nchannels == 2);
23
    wfx->nBlockAlign = 1 << (as->nchannels == 2);
24
    wfx->cbSize = 0;
25

    
26
    switch (as->fmt) {
27
    case AUD_FMT_S8:
28
    case AUD_FMT_U8:
29
        wfx->wBitsPerSample = 8;
30
        break;
31

    
32
    case AUD_FMT_S16:
33
    case AUD_FMT_U16:
34
        wfx->wBitsPerSample = 16;
35
        wfx->nAvgBytesPerSec <<= 1;
36
        wfx->nBlockAlign <<= 1;
37
        break;
38

    
39
    case AUD_FMT_S32:
40
    case AUD_FMT_U32:
41
        wfx->wBitsPerSample = 32;
42
        wfx->nAvgBytesPerSec <<= 2;
43
        wfx->nBlockAlign <<= 2;
44
        break;
45

    
46
    default:
47
        dolog ("Internal logic error: Bad audio format %d\n", as->freq);
48
        return -1;
49
    }
50

    
51
    return 0;
52
}
53

    
54
int waveformat_to_audio_settings (WAVEFORMATEX *wfx,
55
                                  struct audsettings *as)
56
{
57
    if (wfx->wFormatTag != WAVE_FORMAT_PCM) {
58
        dolog ("Invalid wave format, tag is not PCM, but %d\n",
59
               wfx->wFormatTag);
60
        return -1;
61
    }
62

    
63
    if (!wfx->nSamplesPerSec) {
64
        dolog ("Invalid wave format, frequency is zero\n");
65
        return -1;
66
    }
67
    as->freq = wfx->nSamplesPerSec;
68

    
69
    switch (wfx->nChannels) {
70
    case 1:
71
        as->nchannels = 1;
72
        break;
73

    
74
    case 2:
75
        as->nchannels = 2;
76
        break;
77

    
78
    default:
79
        dolog (
80
            "Invalid wave format, number of channels is not 1 or 2, but %d\n",
81
            wfx->nChannels
82
            );
83
        return -1;
84
    }
85

    
86
    switch (wfx->wBitsPerSample) {
87
    case 8:
88
        as->fmt = AUD_FMT_U8;
89
        break;
90

    
91
    case 16:
92
        as->fmt = AUD_FMT_S16;
93
        break;
94

    
95
    case 32:
96
        as->fmt = AUD_FMT_S32;
97
        break;
98

    
99
    default:
100
        dolog ("Invalid wave format, bits per sample is not "
101
               "8, 16 or 32, but %d\n",
102
               wfx->wBitsPerSample);
103
        return -1;
104
    }
105

    
106
    return 0;
107
}
108