174f3dff60f96d89b320f9a322307118676db1dbvboxsync/* $Id$ */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync/** @file
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * VBox audio: Mixing routines, mainly used by the various audio device
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * emulations to achieve proper multiplexing from/to attached
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * devices LUNs.
174f3dff60f96d89b320f9a322307118676db1dbvboxsync */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsync/*
e95cc69731ec79cf167e6167808e1c9b275ea007vboxsync * Copyright (C) 2014-2015 Oracle Corporation
174f3dff60f96d89b320f9a322307118676db1dbvboxsync *
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * available from http://www.virtualbox.org. This file is free software;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * you can redistribute it and/or modify it under the terms of the GNU
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * General Public License (GPL) as published by the Free Software
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
174f3dff60f96d89b320f9a322307118676db1dbvboxsync */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsync#ifndef AUDIO_MIXER_H
174f3dff60f96d89b320f9a322307118676db1dbvboxsync#define AUDIO_MIXER_H
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsync#include <iprt/cdefs.h>
174f3dff60f96d89b320f9a322307118676db1dbvboxsync#include <VBox/vmm/pdmaudioifs.h>
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsynctypedef struct AUDIOMIXER
174f3dff60f96d89b320f9a322307118676db1dbvboxsync{
174f3dff60f96d89b320f9a322307118676db1dbvboxsync /** Mixer name. */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync char *pszName;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync /** Format the mixer should convert/output
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * data to so that the underlying device emulation
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * can work with it. */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync PDMAUDIOSTREAMCFG devFmt;
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync /** The master volume of this mixer. */
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync PDMAUDIOVOLUME VolMaster;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync /* List of audio mixer sinks. */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync RTLISTANCHOR lstSinks;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync /** Number of used audio sinks. */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync uint8_t cSinks;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync} AUDIOMIXER, *PAUDIOMIXER;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsynctypedef struct AUDMIXSTREAM
174f3dff60f96d89b320f9a322307118676db1dbvboxsync{
174f3dff60f96d89b320f9a322307118676db1dbvboxsync RTLISTNODE Node;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync PPDMIAUDIOCONNECTOR pConn;
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync union
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync {
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync PPDMAUDIOGSTSTRMIN pIn;
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync PPDMAUDIOGSTSTRMOUT pOut;
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync };
174f3dff60f96d89b320f9a322307118676db1dbvboxsync} AUDMIXSTREAM, *PAUDMIXSTREAM;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsynctypedef enum AUDMIXSINKDIR
174f3dff60f96d89b320f9a322307118676db1dbvboxsync{
174f3dff60f96d89b320f9a322307118676db1dbvboxsync AUDMIXSINKDIR_UNKNOWN = 0,
174f3dff60f96d89b320f9a322307118676db1dbvboxsync AUDMIXSINKDIR_INPUT,
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync AUDMIXSINKDIR_OUTPUT,
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync /** The usual 32-bit hack. */
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync AUDMIXSINKDIR_32BIT_HACK = 0x7fffffff
174f3dff60f96d89b320f9a322307118676db1dbvboxsync} AUDMIXSINKDIR;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsynctypedef struct AUDMIXSINK
174f3dff60f96d89b320f9a322307118676db1dbvboxsync{
174f3dff60f96d89b320f9a322307118676db1dbvboxsync RTLISTNODE Node;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync /** Name of this sink. */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync char *pszName;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync /** The sink direction, that is,
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * if this sink handles input or output. */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync AUDMIXSINKDIR enmDir;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync /** Pointer to mixer object this sink is bound
174f3dff60f96d89b320f9a322307118676db1dbvboxsync * to. */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync PAUDIOMIXER pParent;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync /** Number of streams assigned. */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync uint8_t cStreams;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync /** List of assigned streams. */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync RTLISTANCHOR lstStreams;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync /** This sink's mixing buffer. */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync PDMAUDIOMIXBUF MixBuf;
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync /** The volume of this sink. The volume always will
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync * be combined with the mixer's master volume. */
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync PDMAUDIOVOLUME Volume;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync} AUDMIXSINK, *PAUDMIXSINK;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsynctypedef enum AUDMIXOP
174f3dff60f96d89b320f9a322307118676db1dbvboxsync{
174f3dff60f96d89b320f9a322307118676db1dbvboxsync AUDMIXOP_NONE = 0,
174f3dff60f96d89b320f9a322307118676db1dbvboxsync AUDMIXOP_COPY,
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync AUDMIXOP_BLEND,
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync /** The usual 32-bit hack. */
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync AUDMIXOP_32BIT_HACK = 0x7fffffff
174f3dff60f96d89b320f9a322307118676db1dbvboxsync} AUDMIXOP;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsyncint audioMixerAddSink(PAUDIOMIXER pMixer, const char *pszName, AUDMIXSINKDIR enmDir, PAUDMIXSINK *ppSink);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncint audioMixerAddStreamIn(PAUDMIXSINK pSink, PPDMIAUDIOCONNECTOR pConnector, PPDMAUDIOGSTSTRMIN pStream, uint32_t uFlags, PAUDMIXSTREAM *ppStream);
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsyncint audioMixerAddStreamOut(PAUDMIXSINK pSink, PPDMIAUDIOCONNECTOR pConnector, PPDMAUDIOGSTSTRMOUT pStream, uint32_t uFlags, PAUDMIXSTREAM *ppStream);
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsyncint audioMixerControlStream(AUDMIXSTREAM pHandle); /** @todo Implement me. */
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncint audioMixerCreate(const char *pszName, uint32_t uFlags, PAUDIOMIXER *ppMixer);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncvoid audioMixerDestroy(PAUDIOMIXER pMixer);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncuint32_t audioMixerGetStreamCount(PAUDIOMIXER pMixer);
40c2e9b6b038e0cb63afd10932a8561418d1d6a7vboxsyncvoid audioMixerInvalidate(PAUDIOMIXER pMixer);
a3b592bbebcadf0cc7c1b9e295f4f8a032128ef0vboxsyncint audioMixerProcessSinkIn(PAUDMIXSINK pSink, AUDMIXOP enmOp, void *pvBuf, uint32_t cbBuf, uint32_t *pcbProcessed);
a3b592bbebcadf0cc7c1b9e295f4f8a032128ef0vboxsyncint audioMixerProcessSinkOut(PAUDMIXSINK pSink, AUDMIXOP enmOp, const void *pvBuf, uint32_t cbBuf, uint32_t *pcbProcessed);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncvoid audioMixerRemoveSink(PAUDIOMIXER pMixer, PAUDMIXSINK pSink);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncvoid audioMixerRemoveStream(PAUDMIXSINK pMixer, PAUDMIXSTREAM pStream);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncint audioMixerSetDeviceFormat(PAUDIOMIXER pMixer, PPDMAUDIOSTREAMCFG pCfg);
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsyncint audioMixerSetMasterVolume(PAUDIOMIXER pMixer, PPDMAUDIOVOLUME pVol);
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsyncint audioMixerSetSinkVolume(PAUDMIXSINK pSink, PPDMAUDIOVOLUME pVol);
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsync#endif /* AUDIO_MIXER_H */
53aa5f00ecfc2d0e5ac355bc452b30cc1202c676vboxsync