malc | d563163 | 2009-10-10 01:13:41 +0400 | [diff] [blame] | 1 | /* public domain */ |
| 2 | |
| 3 | #include "qemu-common.h" |
malc | d563163 | 2009-10-10 01:13:41 +0400 | [diff] [blame] | 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 | |