7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * NULL audio driver -- also acts as a fallback if no
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * other backend is available.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Copyright (C) 2006-2015 Oracle Corporation
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 * This code is based on: noaudio.c QEMU based code.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * QEMU Timer based audio emulation
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Copyright (c) 2004-2005 Vassili Karpov (malc)
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 * The above copyright notice and this permission notice shall be included in
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * all copies or substantial portions of the Software.
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 /** Note: Always must come first! */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /** Note: Always must come first! */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * NULL audio driver instance data.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * @implements PDMIAUDIOCONNECTOR
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /** Pointer to the driver instance structure. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /** Pointer to host audio interface. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync/*******************************************PDM_AUDIO_DRIVER******************************/
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioGetConf(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDCFG pCfg)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pCfg->cMaxHstStrmsIn = 2; /* Line input + microphone input. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioInit(PPDMIHOSTAUDIO pInterface)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioInitIn(PPDMIHOSTAUDIO pInterface,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PPDMAUDIOHSTSTRMIN pHstStrmIn, PPDMAUDIOSTREAMCFG pCfg,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* Just adopt the wanted stream configuration. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc = drvAudioStreamCfgToProps(pCfg, &pHstStrmIn->Props);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioInitOut(PPDMIHOSTAUDIO pInterface,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PPDMAUDIOHSTSTRMOUT pHstStrmOut, PPDMAUDIOSTREAMCFG pCfg,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* Just adopt the wanted stream configuration. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync int rc = drvAudioStreamCfgToProps(pCfg, &pHstStrmOut->Props);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(bool) drvHostNullAudioIsEnabled(PPDMIHOSTAUDIO pInterface, PDMAUDIODIR enmDir)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync return true; /* Always all enabled. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioPlayOut(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMOUT pHstStrmOut,
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync /* Always pretend consuming all samples available at this time. */
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync const uint32_t cSamplesPlayed = audioMixBufSize(&pHstStrmOut->MixBuf);
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync audioMixBufFinish(&pHstStrmOut->MixBuf, cSamplesPlayed);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioCaptureIn(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMIN pHstStrmIn,
dbdc6e4d34bb996153c9c917d80a204944ec87b2vboxsync /* Never capture anything. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioControlIn(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMIN pHstStrmIn,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioControlOut(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMOUT pHstStrmOut,
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioFiniIn(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMIN pHstStrmIn)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioFiniOut(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMOUT pHstStrmOut)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * @interface_method_impl{PDMIBASE,pfnQueryInterface}
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(void *) drvHostNullAudioQueryInterface(PPDMIBASE pInterface, const char *pszIID)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDRVHOSTNULLAUDIO pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTNULLAUDIO);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIHOSTAUDIO, &pThis->IHostAudio);
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsyncstatic DECLCALLBACK(void) drvHostNullAudioShutdown(PPDMIHOSTAUDIO pInterface)
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Constructs a Null audio driver instance.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * @copydoc FNPDMDRVCONSTRUCT
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsyncstatic DECLCALLBACK(int) drvHostNullAudioConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags)
1705f7565ed8533058b8541d72d6c5d4453de00fvboxsync /* pCfg is optional. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync PDRVHOSTNULLAUDIO pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTNULLAUDIO);
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Init the static parts.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* IBase */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync pDrvIns->IBase.pfnQueryInterface = drvHostNullAudioQueryInterface;
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* IHostAudio */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync * Char driver registration record.
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* u32Version */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* szName */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "NullAudio",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* szRCMod */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* szR0Mod */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pszDescription */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync "NULL audio host driver",
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* fFlags */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* fClass. */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* cMaxInstances */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* cbInstance */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnConstruct */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnDestruct */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnRelocate */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnIOCtl */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnPowerOn */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnReset */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnSuspend */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnResume */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnAttach */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnDetach */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnPowerOff */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* pfnSoftReset */
7da9e7e719adde3baba3f6fa1d0bcfb170cf9911vboxsync /* u32EndVersion */