-
Notifications
You must be signed in to change notification settings - Fork 71
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Windows Waveform Audio driver (no ADC support yet)
Signed-off-by: malc <[email protected]>
- Loading branch information
malc
committed
Oct 9, 2009
1 parent
ad32308
commit d563163
Showing
7 changed files
with
449 additions
and
97 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
/* public domain */ | ||
|
||
#include "qemu-common.h" | ||
#include "audio.h" | ||
|
||
#define AUDIO_CAP "win-int" | ||
#include <windows.h> | ||
#include <mmsystem.h> | ||
|
||
#include "audio.h" | ||
#include "audio_int.h" | ||
#include "audio_win_int.h" | ||
|
||
int waveformat_from_audio_settings (WAVEFORMATEX *wfx, | ||
struct audsettings *as) | ||
{ | ||
memset (wfx, 0, sizeof (*wfx)); | ||
|
||
wfx->wFormatTag = WAVE_FORMAT_PCM; | ||
wfx->nChannels = as->nchannels; | ||
wfx->nSamplesPerSec = as->freq; | ||
wfx->nAvgBytesPerSec = as->freq << (as->nchannels == 2); | ||
wfx->nBlockAlign = 1 << (as->nchannels == 2); | ||
wfx->cbSize = 0; | ||
|
||
switch (as->fmt) { | ||
case AUD_FMT_S8: | ||
case AUD_FMT_U8: | ||
wfx->wBitsPerSample = 8; | ||
break; | ||
|
||
case AUD_FMT_S16: | ||
case AUD_FMT_U16: | ||
wfx->wBitsPerSample = 16; | ||
wfx->nAvgBytesPerSec <<= 1; | ||
wfx->nBlockAlign <<= 1; | ||
break; | ||
|
||
case AUD_FMT_S32: | ||
case AUD_FMT_U32: | ||
wfx->wBitsPerSample = 32; | ||
wfx->nAvgBytesPerSec <<= 2; | ||
wfx->nBlockAlign <<= 2; | ||
break; | ||
|
||
default: | ||
dolog ("Internal logic error: Bad audio format %d\n", as->freq); | ||
return -1; | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
int waveformat_to_audio_settings (WAVEFORMATEX *wfx, | ||
struct audsettings *as) | ||
{ | ||
if (wfx->wFormatTag != WAVE_FORMAT_PCM) { | ||
dolog ("Invalid wave format, tag is not PCM, but %d\n", | ||
wfx->wFormatTag); | ||
return -1; | ||
} | ||
|
||
if (!wfx->nSamplesPerSec) { | ||
dolog ("Invalid wave format, frequency is zero\n"); | ||
return -1; | ||
} | ||
as->freq = wfx->nSamplesPerSec; | ||
|
||
switch (wfx->nChannels) { | ||
case 1: | ||
as->nchannels = 1; | ||
break; | ||
|
||
case 2: | ||
as->nchannels = 2; | ||
break; | ||
|
||
default: | ||
dolog ( | ||
"Invalid wave format, number of channels is not 1 or 2, but %d\n", | ||
wfx->nChannels | ||
); | ||
return -1; | ||
} | ||
|
||
switch (wfx->wBitsPerSample) { | ||
case 8: | ||
as->fmt = AUD_FMT_U8; | ||
break; | ||
|
||
case 16: | ||
as->fmt = AUD_FMT_S16; | ||
break; | ||
|
||
case 32: | ||
as->fmt = AUD_FMT_S32; | ||
break; | ||
|
||
default: | ||
dolog ("Invalid wave format, bits per sample is not " | ||
"8, 16 or 32, but %d\n", | ||
wfx->wBitsPerSample); | ||
return -1; | ||
} | ||
|
||
return 0; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#ifndef AUDIO_WIN_INT_H | ||
#define AUDIO_WIN_INT_H | ||
|
||
int waveformat_from_audio_settings (WAVEFORMATEX *wfx, | ||
struct audsettings *as); | ||
|
||
int waveformat_to_audio_settings (WAVEFORMATEX *wfx, | ||
struct audsettings *as); | ||
|
||
#endif /* AUDIO_WIN_INT_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.