7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/* $Id$ */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/** @file
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * NULL audio driver -- also acts as a fallback if no
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * other backend is available.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Copyright (C) 2006-2015 Oracle Corporation
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync *
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * available from http://www.virtualbox.org. This file is free software;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * you can redistribute it and/or modify it under the terms of the GNU
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * General Public License (GPL) as published by the Free Software
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * --------------------------------------------------------------------
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync *
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * This code is based on: noaudio.c QEMU based code.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync *
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * QEMU Timer based audio emulation
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync *
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Copyright (c) 2004-2005 Vassili Karpov (malc)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync *
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Permission is hereby granted, free of charge, to any person obtaining a copy
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * of this software and associated documentation files (the "Software"), to deal
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * in the Software without restriction, including without limitation the rights
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * copies of the Software, and to permit persons to whom the Software is
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * furnished to do so, subject to the following conditions:
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync *
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * The above copyright notice and this permission notice shall be included in
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * all copies or substantial portions of the Software.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync *
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * THE SOFTWARE.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include "DrvAudio.h"
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync#include "AudioMixBuffer.h"
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include "VBoxDD.h"
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include "vl_vbox.h"
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include <iprt/alloc.h>
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include <iprt/uuid.h> /* For PDMIBASE_2_PDMDRV. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include <VBox/vmm/pdmaudioifs.h>
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#ifdef LOG_GROUP
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync# undef LOG_GROUP
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#endif
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#define LOG_GROUP LOG_GROUP_DEV_AUDIO
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync#include <VBox/log.h>
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsynctypedef struct NULLAUDIOSTREAMOUT
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /** Note: Always must come first! */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDMAUDIOHSTSTRMOUT hw;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync} NULLAUDIOSTREAMOUT;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsynctypedef struct NULLAUDIOSTREAMIN
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /** Note: Always must come first! */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDMAUDIOHSTSTRMIN hw;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync} NULLAUDIOSTREAMIN;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/**
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * NULL audio driver instance data.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * @implements PDMIAUDIOCONNECTOR
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsynctypedef struct DRVHOSTNULLAUDIO
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /** Pointer to the driver instance structure. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PPDMDRVINS pDrvIns;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /** Pointer to host audio interface. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDMIHOSTAUDIO IHostAudio;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync} DRVHOSTNULLAUDIO, *PDRVHOSTNULLAUDIO;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/*******************************************PDM_AUDIO_DRIVER******************************/
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioGetConf(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDCFG pCfg)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NOREF(pInterface);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync AssertPtrReturn(pCfg, VERR_INVALID_POINTER);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pCfg->cbStreamOut = sizeof(NULLAUDIOSTREAMOUT);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pCfg->cbStreamIn = sizeof(NULLAUDIOSTREAMIN);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pCfg->cMaxHstStrmsOut = 1; /* Output */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pCfg->cMaxHstStrmsIn = 2; /* Line input + microphone input. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return VINF_SUCCESS;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioInit(PPDMIHOSTAUDIO pInterface)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NOREF(pInterface);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return VINF_SUCCESS;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioInitIn(PPDMIHOSTAUDIO pInterface,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PPDMAUDIOHSTSTRMIN pHstStrmIn, PPDMAUDIOSTREAMCFG pCfg,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDMAUDIORECSOURCE enmRecSource,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync uint32_t *pcSamples)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NOREF(pInterface);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NOREF(enmRecSource);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* Just adopt the wanted stream configuration. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc = drvAudioStreamCfgToProps(pCfg, &pHstStrmIn->Props);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (RT_SUCCESS(rc))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (pcSamples)
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync *pcSamples = _1K;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return VINF_SUCCESS;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioInitOut(PPDMIHOSTAUDIO pInterface,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PPDMAUDIOHSTSTRMOUT pHstStrmOut, PPDMAUDIOSTREAMCFG pCfg,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync uint32_t *pcSamples)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NOREF(pInterface);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* Just adopt the wanted stream configuration. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc = drvAudioStreamCfgToProps(pCfg, &pHstStrmOut->Props);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (RT_SUCCESS(rc))
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync {
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (pcSamples)
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync *pcSamples = _1K;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync }
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return rc;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(bool) drvHostNullAudioIsEnabled(PPDMIHOSTAUDIO pInterface, PDMAUDIODIR enmDir)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NOREF(pInterface);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NOREF(enmDir);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return true; /* Always all enabled. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioPlayOut(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMOUT pHstStrmOut,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync uint32_t *pcSamplesPlayed)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync /* Always pretend consuming all samples available at this time. */
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync const uint32_t cSamplesPlayed = audioMixBufSize(&pHstStrmOut->MixBuf);
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync audioMixBufFinish(&pHstStrmOut->MixBuf, cSamplesPlayed);
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (pcSamplesPlayed)
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync *pcSamplesPlayed = cSamplesPlayed;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return VINF_SUCCESS;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioCaptureIn(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMIN pHstStrmIn,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync uint32_t *pcSamplesCaptured)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync /* Never capture anything. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync if (pcSamplesCaptured)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync *pcSamplesCaptured = 0;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return VINF_SUCCESS;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioControlIn(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMIN pHstStrmIn,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDMAUDIOSTREAMCMD enmStreamCmd)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NOREF(pInterface);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NOREF(pHstStrmIn);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NOREF(enmStreamCmd);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return VINF_SUCCESS;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioControlOut(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMOUT pHstStrmOut,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDMAUDIOSTREAMCMD enmStreamCmd)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NOREF(pInterface);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NOREF(pHstStrmOut);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NOREF(enmStreamCmd);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return VINF_SUCCESS;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioFiniIn(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMIN pHstStrmIn)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return VINF_SUCCESS;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioFiniOut(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMOUT pHstStrmOut)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return VINF_SUCCESS;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/**
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * @interface_method_impl{PDMIBASE,pfnQueryInterface}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(void *) drvHostNullAudioQueryInterface(PPDMIBASE pInterface, const char *pszIID)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDRVHOSTNULLAUDIO pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTNULLAUDIO);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIHOSTAUDIO, &pThis->IHostAudio);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return NULL;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsyncstatic DECLCALLBACK(void) drvHostNullAudioShutdown(PPDMIHOSTAUDIO pInterface)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsync NOREF(pInterface);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/**
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Constructs a Null audio driver instance.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync *
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * @copydoc FNPDMDRVCONSTRUCT
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsync AssertPtrReturn(pDrvIns, VERR_INVALID_POINTER);
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsync /* pCfg is optional. */
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDRVHOSTNULLAUDIO pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTNULLAUDIO);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync LogRel(("Audio: Initializing NULL driver\n"));
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /*
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Init the static parts.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pThis->pDrvIns = pDrvIns;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* IBase */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pDrvIns->IBase.pfnQueryInterface = drvHostNullAudioQueryInterface;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* IHostAudio */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDMAUDIO_IHOSTAUDIO_CALLBACKS(drvHostNullAudio);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return VINF_SUCCESS;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/**
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Char driver registration record.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncconst PDMDRVREG g_DrvHostNullAudio =
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync{
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* u32Version */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDM_DRVREG_VERSION,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* szName */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "NullAudio",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* szRCMod */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* szR0Mod */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pszDescription */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "NULL audio host driver",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* fFlags */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* fClass. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDM_DRVREG_CLASS_AUDIO,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* cMaxInstances */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync ~0U,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* cbInstance */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync sizeof(DRVHOSTNULLAUDIO),
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnConstruct */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync drvHostNullAudioConstruct,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnDestruct */
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsync NULL,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnRelocate */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NULL,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnIOCtl */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NULL,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnPowerOn */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NULL,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnReset */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NULL,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnSuspend */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NULL,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnResume */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NULL,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnAttach */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NULL,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnDetach */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NULL,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnPowerOff */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NULL,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnSoftReset */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync NULL,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* u32EndVersion */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDM_DRVREG_VERSION
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync};
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync