summaryrefslogtreecommitdiffstats
path: root/audio/audio_win_int.c
diff options
context:
space:
mode:
authorPeter Maydell2021-01-15 23:21:21 +0100
committerPeter Maydell2021-01-15 23:21:21 +0100
commit825a215c003cd028e26c7d19aa5049d957345f43 (patch)
treea3bedcc1d73490abbe5994b065289147f8d0b10e /audio/audio_win_int.c
parentMerge remote-tracking branch 'remotes/kraxel/tags/ui-20210115-pull-request' i... (diff)
parentaudio: space prohibited between function name and parenthesis'(' (diff)
downloadqemu-825a215c003cd028e26c7d19aa5049d957345f43.tar.gz
qemu-825a215c003cd028e26c7d19aa5049d957345f43.tar.xz
qemu-825a215c003cd028e26c7d19aa5049d957345f43.zip
Merge remote-tracking branch 'remotes/kraxel/tags/audio-20210115-pull-request' into staging
audio: improvements for sdl, pulse, fsound. audio: cleanups & codestyle fixes. # gpg: Signature made Fri 15 Jan 2021 13:20:56 GMT # gpg: using RSA key A0328CFFB93A17A79901FE7D4CB6D8EED3E87138 # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" [full] # gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" [full] # gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" [full] # Primary key fingerprint: A032 8CFF B93A 17A7 9901 FE7D 4CB6 D8EE D3E8 7138 * remotes/kraxel/tags/audio-20210115-pull-request: (30 commits) audio: space prohibited between function name and parenthesis'(' audio: Suspect code indent for conditional statements audio: Don't use '%#' in format strings audio: Fix lines over 90 characters audio: foo* bar" should be "foo *bar". audio: Add spaces around operator/delete redundant spaces audio: Add braces for statements/fix braces' position dsoundaudio: fix log message dsoundaudio: enable f32 audio sample format dsoundaudio: rename dsound_open() dsoundaudio: replace GetForegroundWindow() paaudio: send recorded data in smaller chunks paaudio: limit minreq to 75% of audio timer_rate paaudio: comment bugs in functions qpa_init_* paaudio: remove unneeded code paaudio: wait until the playback stream is ready paaudio: wait for PA_STREAM_READY in qpa_write() paaudio: avoid to clip samples multiple times audio: remove remaining unused plive code sdlaudio: enable (in|out).mixing-engine=off ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'audio/audio_win_int.c')
-rw-r--r--audio/audio_win_int.c73
1 files changed, 48 insertions, 25 deletions
diff --git a/audio/audio_win_int.c b/audio/audio_win_int.c
index b938fd667b..5ea8157dfc 100644
--- a/audio/audio_win_int.c
+++ b/audio/audio_win_int.c
@@ -5,6 +5,7 @@
#define AUDIO_CAP "win-int"
#include <windows.h>
+#include <mmreg.h>
#include <mmsystem.h>
#include "audio.h"
@@ -16,7 +17,6 @@ int waveformat_from_audio_settings (WAVEFORMATEX *wfx,
{
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);
@@ -26,11 +26,13 @@ int waveformat_from_audio_settings (WAVEFORMATEX *wfx,
switch (as->fmt) {
case AUDIO_FORMAT_S8:
case AUDIO_FORMAT_U8:
+ wfx->wFormatTag = WAVE_FORMAT_PCM;
wfx->wBitsPerSample = 8;
break;
case AUDIO_FORMAT_S16:
case AUDIO_FORMAT_U16:
+ wfx->wFormatTag = WAVE_FORMAT_PCM;
wfx->wBitsPerSample = 16;
wfx->nAvgBytesPerSec <<= 1;
wfx->nBlockAlign <<= 1;
@@ -38,13 +40,21 @@ int waveformat_from_audio_settings (WAVEFORMATEX *wfx,
case AUDIO_FORMAT_S32:
case AUDIO_FORMAT_U32:
+ wfx->wFormatTag = WAVE_FORMAT_PCM;
+ wfx->wBitsPerSample = 32;
+ wfx->nAvgBytesPerSec <<= 2;
+ wfx->nBlockAlign <<= 2;
+ break;
+
+ case AUDIO_FORMAT_F32:
+ wfx->wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
wfx->wBitsPerSample = 32;
wfx->nAvgBytesPerSec <<= 2;
wfx->nBlockAlign <<= 2;
break;
default:
- dolog ("Internal logic error: Bad audio format %d\n", as->freq);
+ dolog("Internal logic error: Bad audio format %d\n", as->fmt);
return -1;
}
@@ -54,12 +64,6 @@ int waveformat_from_audio_settings (WAVEFORMATEX *wfx,
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;
@@ -83,23 +87,42 @@ int waveformat_to_audio_settings (WAVEFORMATEX *wfx,
return -1;
}
- switch (wfx->wBitsPerSample) {
- case 8:
- as->fmt = AUDIO_FORMAT_U8;
- break;
-
- case 16:
- as->fmt = AUDIO_FORMAT_S16;
- break;
-
- case 32:
- as->fmt = AUDIO_FORMAT_S32;
- break;
-
- default:
- dolog ("Invalid wave format, bits per sample is not "
- "8, 16 or 32, but %d\n",
- wfx->wBitsPerSample);
+ if (wfx->wFormatTag == WAVE_FORMAT_PCM) {
+ switch (wfx->wBitsPerSample) {
+ case 8:
+ as->fmt = AUDIO_FORMAT_U8;
+ break;
+
+ case 16:
+ as->fmt = AUDIO_FORMAT_S16;
+ break;
+
+ case 32:
+ as->fmt = AUDIO_FORMAT_S32;
+ break;
+
+ default:
+ dolog("Invalid PCM wave format, bits per sample is not "
+ "8, 16 or 32, but %d\n",
+ wfx->wBitsPerSample);
+ return -1;
+ }
+ } else if (wfx->wFormatTag == WAVE_FORMAT_IEEE_FLOAT) {
+ switch (wfx->wBitsPerSample) {
+ case 32:
+ as->fmt = AUDIO_FORMAT_F32;
+ break;
+
+ default:
+ dolog("Invalid IEEE_FLOAT wave format, bits per sample is not "
+ "32, but %d\n",
+ wfx->wBitsPerSample);
+ return -1;
+ }
+ } else {
+ dolog("Invalid wave format, tag is not PCM and not IEEE_FLOAT, "
+ "but %d\n",
+ wfx->wFormatTag);
return -1;
}