Home | History | Annotate | Download | only in audio
      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