AudioMixer.h revision e95cc69731ec79cf167e6167808e1c9b275ea007
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;
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;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync /** @todo Add support for output streams. */
174f3dff60f96d89b320f9a322307118676db1dbvboxsync PPDMAUDIOGSTSTRMIN pStrm;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync} AUDMIXSTREAM, *PAUDMIXSTREAM;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsynctypedef enum AUDMIXSINKDIR
174f3dff60f96d89b320f9a322307118676db1dbvboxsync{
174f3dff60f96d89b320f9a322307118676db1dbvboxsync AUDMIXSINKDIR_UNKNOWN = 0,
174f3dff60f96d89b320f9a322307118676db1dbvboxsync AUDMIXSINKDIR_INPUT,
174f3dff60f96d89b320f9a322307118676db1dbvboxsync AUDMIXSINKDIR_OUTPUT
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;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync} AUDMIXSINK, *PAUDMIXSINK;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsynctypedef enum AUDMIXOP
174f3dff60f96d89b320f9a322307118676db1dbvboxsync{
174f3dff60f96d89b320f9a322307118676db1dbvboxsync AUDMIXOP_NONE = 0,
174f3dff60f96d89b320f9a322307118676db1dbvboxsync AUDMIXOP_COPY,
174f3dff60f96d89b320f9a322307118676db1dbvboxsync AUDMIXOP_BLEND
174f3dff60f96d89b320f9a322307118676db1dbvboxsync} AUDMIXOP;
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncint audioMixerAddSink(PAUDIOMIXER pMixer, const char *pszName, PAUDMIXSINK *ppSink);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncint audioMixerAddStreamIn(PAUDMIXSINK pSink, PPDMIAUDIOCONNECTOR pConnector, PPDMAUDIOGSTSTRMIN pStream, uint32_t uFlags, PAUDMIXSTREAM *ppStream);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncint audioMixerControlStream(AUDMIXSTREAM pHandle); /** @todo */
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncint audioMixerCreate(const char *pszName, uint32_t uFlags, PAUDIOMIXER *ppMixer);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncvoid audioMixerDestroy(PAUDIOMIXER pMixer);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncint audioMixerProcessSamples(AUDMIXOP enmOp, PPDMAUDIOSAMPLE pDst, uint32_t cToWrite, PPDMAUDIOSAMPLE pSrc, uint32_t cToRead, uint32_t *pcRead, uint32_t *pcWritten);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncint audioMixerProcessSamplesEx(AUDMIXOP enmOp, void *pvParms, size_t cbParms, PPDMAUDIOSAMPLE pDst, uint32_t cToWrite, PPDMAUDIOSAMPLE pSrc, uint32_t cToRead, uint32_t *pcRead, uint32_t *pcWritten);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncuint32_t audioMixerGetStreamCount(PAUDIOMIXER pMixer);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncint audioMixerProcessSinkIn(PAUDMIXSINK pSink, void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncvoid audioMixerRemoveSink(PAUDIOMIXER pMixer, PAUDMIXSINK pSink);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncvoid audioMixerRemoveStream(PAUDMIXSINK pMixer, PAUDMIXSTREAM pStream);
174f3dff60f96d89b320f9a322307118676db1dbvboxsyncint audioMixerSetDeviceFormat(PAUDIOMIXER pMixer, PPDMAUDIOSTREAMCFG pCfg);
174f3dff60f96d89b320f9a322307118676db1dbvboxsync
174f3dff60f96d89b320f9a322307118676db1dbvboxsync#endif /* AUDIO_MIXER_H */