mmap audio fix (malc)

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1138 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
bellard 2004-11-14 16:02:51 +00:00
parent 15b6147000
commit 44a095a77c
1 changed files with 17 additions and 16 deletions

View File

@ -370,29 +370,30 @@ static int oss_hw_init (HWVoice *hw, int freq, int nchannels, audfmt_e fmt)
if (oss->pcm_buf == MAP_FAILED) { if (oss->pcm_buf == MAP_FAILED) {
dolog ("Failed to mmap OSS device\nReason: %s\n", dolog ("Failed to mmap OSS device\nReason: %s\n",
errstr ()); errstr ());
} else for (;;) { } else {
int err; int err;
int trig = 0; int trig = 0;
if (ioctl (oss->fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) { if (ioctl (oss->fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) {
dolog ("SNDCTL_DSP_SETTRIGGER 0 failed\nReason: %s\n", dolog ("SNDCTL_DSP_SETTRIGGER 0 failed\nReason: %s\n",
errstr ()); errstr ());
goto fail; }
else {
trig = PCM_ENABLE_OUTPUT;
if (ioctl (oss->fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) {
dolog ("SNDCTL_DSP_SETTRIGGER PCM_ENABLE_OUTPUT failed\n"
"Reason: %s\n", errstr ());
}
else {
oss->mmapped = 1;
}
} }
trig = PCM_ENABLE_OUTPUT; if (!oss->mmapped) {
if (ioctl (oss->fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) { err = munmap (oss->pcm_buf, hw->bufsize);
dolog ("SNDCTL_DSP_SETTRIGGER PCM_ENABLE_OUTPUT failed\n" if (err) {
"Reason: %s\n", errstr ()); dolog ("Failed to unmap OSS device\nReason: %s\n",
goto fail; errstr ());
} }
oss->mmapped = 1;
break;
fail:
err = munmap (oss->pcm_buf, hw->bufsize);
if (err) {
dolog ("Failed to unmap OSS device\nReason: %s\n",
errstr ());
} }
} }
} }