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 109