Index: /trunk/src/VBox/Devices/Audio/DrvHostAudioDebug.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DrvHostAudioDebug.cpp	(revision 88456)
+++ /trunk/src/VBox/Devices/Audio/DrvHostAudioDebug.cpp	(revision 88457)
@@ -16,10 +16,8 @@
  */
 
-#include <iprt/mem.h>
-#include <iprt/rand.h>
-#include <iprt/uuid.h> /* For PDMIBASE_2_PDMDRV. */
-
-#include <math.h>
-
+
+/*********************************************************************************************************************************
+*   Header Files                                                                                                                 *
+*********************************************************************************************************************************/
 #define LOG_GROUP LOG_GROUP_DRV_HOST_AUDIO
 #include <VBox/log.h>
@@ -27,30 +25,43 @@
 #include <VBox/vmm/pdmaudioinline.h>
 
+#include <iprt/rand.h>
+#include <iprt/uuid.h> /* For PDMIBASE_2_PDMDRV. */
+
+#define _USE_MATH_DEFINES
+#include <math.h> /* sin, M_PI */
+
 #include "AudioHlp.h"
 #include "VBoxDD.h"
 
 
-/**
- * Structure for keeping a debug input/output stream.
+/*********************************************************************************************************************************
+*   Structures and Typedefs                                                                                                      *
+*********************************************************************************************************************************/
+/**
+ * Debug host audio stream.
  */
 typedef struct DEBUGAUDIOSTREAM
 {
     /** The stream's acquired configuration. */
-    PPDMAUDIOSTREAMCFG pCfg;
+    PDMAUDIOSTREAMCFG   Cfg;
     /** Audio file to dump output to or read input from. */
-    PAUDIOHLPFILE      pFile;
+    PAUDIOHLPFILE       pFile;
     union
     {
         struct
         {
+            /** Current sample index for generate the sine wave. */
+            uint64_t    uSample;
+            /** The fixed portion of the sin() input. */
+            double      rdFixed;
+            /** Timestamp of last captured samples. */
+            uint64_t    tsLastCaptured;
             /** Frequency (in Hz) of the sine wave to generate. */
-            uint16_t   uFreqHz;
-            /** Current sample index for generate the sine wave. */
-            uint64_t   uSample;
-            /** Timestamp of last captured samples. */
-            uint64_t   tsLastCaptured;
+            double      rdFreqHz;
         } In;
     };
-} DEBUGAUDIOSTREAM, *PDEBUGAUDIOSTREAM;
+} DEBUGAUDIOSTREAM;
+/** Pointer to a debug host audio stream. */
+typedef DEBUGAUDIOSTREAM *PDEBUGAUDIOSTREAM;
 
 /**
@@ -61,10 +72,28 @@
 {
     /** Pointer to the driver instance structure. */
-    PPDMDRVINS    pDrvIns;
+    PPDMDRVINS      pDrvIns;
     /** Pointer to host audio interface. */
-    PDMIHOSTAUDIO IHostAudio;
-} DRVHOSTDEBUGAUDIO, *PDRVHOSTDEBUGAUDIO;
-
-/*******************************************PDM_AUDIO_DRIVER******************************/
+    PDMIHOSTAUDIO   IHostAudio;
+} DRVHOSTDEBUGAUDIO;
+/** Pointer to a debug host audio driver. */
+typedef DRVHOSTDEBUGAUDIO *PDRVHOSTDEBUGAUDIO;
+
+
+/*********************************************************************************************************************************
+*   Global Variables                                                                                                             *
+*********************************************************************************************************************************/
+/** Frequency selection for input streams. */
+static const double s_ardInputFreqsHz[] =
+{
+     349.2282 /*F4*/,
+     440.0000 /*A4*/,
+     523.2511 /*C5*/,
+     698.4565 /*F5*/,
+     880.0000 /*A5*/,
+    1046.502  /*C6*/,
+    1174.659  /*D6*/,
+    1396.913  /*F6*/,
+    1760.0000 /*A6*/
+};
 
 
@@ -77,5 +106,5 @@
     AssertPtrReturn(pBackendCfg, VERR_INVALID_POINTER);
 
-    RTStrPrintf2(pBackendCfg->szName, sizeof(pBackendCfg->szName), "DebugAudio");
+    RTStrCopy(pBackendCfg->szName, sizeof(pBackendCfg->szName), "DebugAudio");
 
     pBackendCfg->cbStreamOut    = sizeof(DEBUGAUDIOSTREAM);
@@ -94,62 +123,6 @@
 static DECLCALLBACK(PDMAUDIOBACKENDSTS) drvHostDebugAudioHA_GetStatus(PPDMIHOSTAUDIO pInterface, PDMAUDIODIR enmDir)
 {
-    RT_NOREF(enmDir);
-    AssertPtrReturn(pInterface, PDMAUDIOBACKENDSTS_UNKNOWN);
-
+    RT_NOREF(pInterface, enmDir);
     return PDMAUDIOBACKENDSTS_RUNNING;
-}
-
-
-/**
- * Creates a debug output .WAV file on the host with the specified stream configuration.
- *
- * @returns VBox status code.
- * @param   pDrv                Driver instance.
- * @param   pStreamDbg          Debug audio stream to create file for.
- * @param   fIn                 Whether this is an input or output stream to create file for.
- * @param   pCfg                Stream configuration to create .wAV file with.
- */
-static int debugCreateFile(PDRVHOSTDEBUGAUDIO pDrv, PDEBUGAUDIOSTREAM pStreamDbg, bool fIn, PPDMAUDIOSTREAMCFG pCfg)
-{
-    char szFile[RTPATH_MAX];
-    int rc = AudioHlpFileNameGet(szFile, RT_ELEMENTS(szFile), NULL /* Use temporary directory */, fIn ? "DebugAudioIn" : "DebugAudioOut",
-                                 pDrv->pDrvIns->iInstance, AUDIOHLPFILETYPE_WAV, AUDIOHLPFILENAME_FLAGS_NONE);
-    if (RT_SUCCESS(rc))
-    {
-        rc = AudioHlpFileCreate(AUDIOHLPFILETYPE_WAV, szFile, AUDIOHLPFILE_FLAGS_NONE, &pStreamDbg->pFile);
-        if (RT_SUCCESS(rc))
-            rc = AudioHlpFileOpen(pStreamDbg->pFile, RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE_REPLACE, &pCfg->Props);
-        if (RT_FAILURE(rc))
-            LogRel(("DebugAudio: Creating %sput file '%s' failed with %Rrc\n", fIn ? "in" : "out", szFile, rc));
-    }
-    else
-        LogRel(("DebugAudio: Unable to build file name: %Rrc\n", rc));
-
-    return rc;
-}
-
-
-static int debugCreateStreamIn(PDRVHOSTDEBUGAUDIO pDrv, PDEBUGAUDIOSTREAM pStreamDbg,
-                               PPDMAUDIOSTREAMCFG pCfgReq, PPDMAUDIOSTREAMCFG pCfgAcq)
-{
-    RT_NOREF(pDrv, pCfgReq);
-
-    pStreamDbg->In.uSample   = 0; /* Initialize sample index. */
-
-    const uint16_t auFreqsHz[] = { 400, 600, 750, 800, 1000, 1200, 1400, 1600 };
-
-    /* Chose a random frequency so that every time a recording is started (hopefully) another tone will be generated. */
-    pStreamDbg->In.uFreqHz   = auFreqsHz[RTRandU32Ex(0, RT_ELEMENTS(auFreqsHz) - 1)];
-
-    return debugCreateFile(pDrv, pStreamDbg, true /* fIn */, pCfgAcq);
-}
-
-
-static int debugCreateStreamOut(PDRVHOSTDEBUGAUDIO pDrv, PDEBUGAUDIOSTREAM pStreamDbg,
-                                PPDMAUDIOSTREAMCFG pCfgReq, PPDMAUDIOSTREAMCFG pCfgAcq)
-{
-    RT_NOREF(pDrv, pCfgAcq);
-
-    return debugCreateFile(pDrv, pStreamDbg, false /* fIn */, pCfgReq);
 }
 
@@ -161,26 +134,102 @@
                                                           PPDMAUDIOSTREAMCFG pCfgReq, PPDMAUDIOSTREAMCFG pCfgAcq)
 {
-    AssertPtrReturn(pInterface, VERR_INVALID_POINTER);
-    AssertPtrReturn(pStream,    VERR_INVALID_POINTER);
-    AssertPtrReturn(pCfgReq,    VERR_INVALID_POINTER);
-    AssertPtrReturn(pCfgAcq,    VERR_INVALID_POINTER);
-
     PDRVHOSTDEBUGAUDIO pDrv       = RT_FROM_MEMBER(pInterface, DRVHOSTDEBUGAUDIO, IHostAudio);
     PDEBUGAUDIOSTREAM  pStreamDbg = (PDEBUGAUDIOSTREAM)pStream;
-
-    int rc;
+    AssertPtrReturn(pStreamDbg, VERR_INVALID_POINTER);
+    AssertPtrReturn(pCfgReq, VERR_INVALID_POINTER);
+    AssertPtrReturn(pCfgAcq, VERR_INVALID_POINTER);
+
+    PDMAudioStrmCfgCopy(&pStreamDbg->Cfg, pCfgAcq);
+
     if (pCfgReq->enmDir == PDMAUDIODIR_IN)
-        rc = debugCreateStreamIn( pDrv, pStreamDbg, pCfgReq, pCfgAcq);
-    else
-        rc = debugCreateStreamOut(pDrv, pStreamDbg, pCfgReq, pCfgAcq);
-
-    if (RT_SUCCESS(rc))
     {
-        pStreamDbg->pCfg = PDMAudioStrmCfgDup(pCfgAcq);
-        if (!pStreamDbg->pCfg)
-            rc = VERR_NO_MEMORY;
+        /* Pick a frequency from our selection, so that every time a recording starts
+           we'll hopfully generate a different note. */
+        pStreamDbg->In.rdFreqHz = s_ardInputFreqsHz[RTRandU32Ex(0, RT_ELEMENTS(s_ardInputFreqsHz) - 1)];
+        pStreamDbg->In.rdFixed  = 2.0 * M_PI * pStreamDbg->In.rdFreqHz / PDMAudioPropsHz(&pStreamDbg->Cfg.Props);
+        pStreamDbg->In.uSample  = 0;
     }
 
+    int rc = AudioHlpFileCreateAndOpenEx(&pStreamDbg->pFile, AUDIOHLPFILETYPE_WAV, NULL /*use temp dir*/,
+                                         pCfgReq->enmDir == PDMAUDIODIR_IN ? "DebugAudioIn" : "DebugAudioOut",
+                                         pDrv->pDrvIns->iInstance, AUDIOHLPFILENAME_FLAGS_NONE, AUDIOHLPFILE_FLAGS_NONE,
+                                         &pCfgReq->Props, RTFILE_O_WRITE | RTFILE_O_DENY_WRITE | RTFILE_O_CREATE_REPLACE);
+    if (RT_FAILURE(rc))
+        LogRel(("DebugAudio: Failed to creating debug file for %s stream '%s' in the temp directory: %Rrc\n",
+                pCfgReq->enmDir == PDMAUDIODIR_IN ? "input" : "output", pCfgReq->szName, rc));
+
     return rc;
+}
+
+
+/**
+ * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamDestroy}
+ */
+static DECLCALLBACK(int) drvHostDebugAudioHA_StreamDestroy(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
+{
+    RT_NOREF(pInterface);
+    PDEBUGAUDIOSTREAM pStreamDbg = (PDEBUGAUDIOSTREAM)pStream;
+    AssertPtrReturn(pStreamDbg, VERR_INVALID_POINTER);
+
+    if (pStreamDbg->pFile)
+    {
+        AudioHlpFileDestroy(pStreamDbg->pFile);
+        pStreamDbg->pFile = NULL;
+    }
+
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamControl}
+ */
+static DECLCALLBACK(int) drvHostDebugAudioHA_StreamControl(PPDMIHOSTAUDIO pInterface,
+                                                           PPDMAUDIOBACKENDSTREAM pStream, PDMAUDIOSTREAMCMD enmStreamCmd)
+{
+    RT_NOREF(pInterface, pStream, enmStreamCmd);
+    return VINF_SUCCESS;
+}
+
+
+/**
+ * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetReadable}
+ */
+static DECLCALLBACK(uint32_t) drvHostDebugAudioHA_StreamGetReadable(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
+{
+    RT_NOREF(pInterface);
+    PDEBUGAUDIOSTREAM pStreamDbg = (PDEBUGAUDIOSTREAM)pStream;
+
+    return PDMAudioPropsMilliToBytes(&pStreamDbg->Cfg.Props, 10 /*ms*/);
+}
+
+
+/**
+ * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetWritable}
+ */
+static DECLCALLBACK(uint32_t) drvHostDebugAudioHA_StreamGetWritable(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
+{
+    RT_NOREF(pInterface, pStream);
+    return UINT32_MAX;
+}
+
+
+/**
+ * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetPending}
+ */
+static DECLCALLBACK(uint32_t) drvHostDebugAudioHA_StreamGetPending(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
+{
+    RT_NOREF(pInterface, pStream);
+    return 0;
+}
+
+
+/**
+ * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetWritable}
+ */
+static DECLCALLBACK(PDMAUDIOSTREAMSTS) drvHostDebugAudioHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
+{
+    RT_NOREF(pInterface, pStream);
+    return PDMAUDIOSTREAMSTS_FLAGS_INITIALIZED | PDMAUDIOSTREAMSTS_FLAGS_ENABLED;
 }
 
@@ -192,6 +241,6 @@
                                                         const void *pvBuf, uint32_t cbBuf, uint32_t *pcbWritten)
 {
+    RT_NOREF(pInterface);
     PDEBUGAUDIOSTREAM pStreamDbg = (PDEBUGAUDIOSTREAM)pStream;
-    RT_NOREF(pInterface);
 
     int rc = AudioHlpFileWrite(pStreamDbg->pFile, pvBuf, cbBuf, 0 /* fFlags */);
@@ -199,5 +248,5 @@
         *pcbWritten = cbBuf;
     else
-        LogRel(("DebugAudio: Writing output failed with %Rrc\n", rc));
+        LogRelMax(32, ("DebugAudio: Writing output failed with %Rrc\n", rc));
     return rc;
 }
@@ -208,138 +257,111 @@
  */
 static DECLCALLBACK(int) drvHostDebugAudioHA_StreamCapture(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream,
-                                                           void *pvBuf, uint32_t uBufSize, uint32_t *puRead)
+                                                           void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead)
 {
     RT_NOREF(pInterface);
-
-    PDEBUGAUDIOSTREAM  pStreamDbg = (PDEBUGAUDIOSTREAM)pStream;
-
-    PPDMAUDIOSTREAMCFG pCfg = pStreamDbg->pCfg;
-    AssertPtr(pCfg);
-
-    Assert(uBufSize % PDMAudioPropsSampleSize(&pCfg->Props) == 0);
-    size_t const cSamples = uBufSize / PDMAudioPropsSampleSize(&pCfg->Props);
-
-    uint16_t *paBuf = (uint16_t *)pvBuf;
-
-    /* Generate a simple mono sine wave. */
-    for (size_t i = 0; i < cSamples; i++)
+    PDEBUGAUDIOSTREAM pStreamDbg = (PDEBUGAUDIOSTREAM)pStream;
+/** @todo rate limit this?  */
+
+    /*
+     * Clear the buffer first so we don't need to thing about additional channels.
+     */
+    uint32_t cFrames = PDMAudioPropsBytesToFrames(&pStreamDbg->Cfg.Props, cbBuf);
+    PDMAudioPropsClearBuffer(&pStreamDbg->Cfg.Props, pvBuf, cbBuf, cFrames);
+
+    /*
+     * Generate the select sin wave in the first channel:
+     */
+    uint32_t const cbFrame   = PDMAudioPropsFrameSize(&pStreamDbg->Cfg.Props);
+    double const   rdFixed   = pStreamDbg->In.rdFixed;
+    uint64_t       iSrcFrame = pStreamDbg->In.uSample;
+    switch (PDMAudioPropsSampleSize(&pStreamDbg->Cfg.Props))
     {
-        paBuf[i] = 32760 * sin((2.f * float(3.1415) * pStreamDbg->In.uFreqHz) / pCfg->Props.uHz * pStreamDbg->In.uSample);
-        if (pStreamDbg->In.uSample == UINT64_MAX)
-        {
-            pStreamDbg->In.uSample = 0;
-            continue;
-        }
-
-        pStreamDbg->In.uSample++;
+        case 1:
+            /* untested */
+            if (PDMAudioPropsIsSigned(&pStreamDbg->Cfg.Props))
+            {
+                int8_t *piSample = (int8_t *)pvBuf;
+                while (cFrames-- > 0)
+                {
+                    *piSample = 126 /*Amplitude*/ * sin(rdFixed * iSrcFrame);
+                    iSrcFrame++;
+                    piSample += cbFrame;
+                }
+            }
+            else
+            {
+                /* untested */
+                uint16_t *pbSample = (uint16_t *)pvBuf;
+                while (cFrames-- > 0)
+                {
+                    *pbSample = 126 /*Amplitude*/ * sin(rdFixed * iSrcFrame) + 0x80;
+                    iSrcFrame++;
+                    pbSample += cbFrame;
+                }
+            }
+            break;
+
+        case 2:
+            if (PDMAudioPropsIsSigned(&pStreamDbg->Cfg.Props))
+            {
+                int16_t *piSample = (int16_t *)pvBuf;
+                while (cFrames-- > 0)
+                {
+                    *piSample = 32760 /*Amplitude*/ * sin(rdFixed * iSrcFrame);
+                    iSrcFrame++;
+                    piSample = (int16_t *)((uint8_t *)piSample + cbFrame);
+                }
+            }
+            else
+            {
+                /* untested */
+                uint16_t *puSample = (uint16_t *)pvBuf;
+                while (cFrames-- > 0)
+                {
+                    *puSample = 32760 /*Amplitude*/ * sin(rdFixed * iSrcFrame) + 0x8000;
+                    iSrcFrame++;
+                    puSample = (uint16_t *)((uint8_t *)puSample + cbFrame);
+                }
+            }
+            break;
+
+        case 4:
+            /* untested */
+            if (PDMAudioPropsIsSigned(&pStreamDbg->Cfg.Props))
+            {
+                int32_t *piSample = (int32_t *)pvBuf;
+                while (cFrames-- > 0)
+                {
+                    *piSample = (32760 << 16) /*Amplitude*/ * sin(rdFixed * iSrcFrame);
+                    iSrcFrame++;
+                    piSample = (int32_t *)((uint8_t *)piSample + cbFrame);
+                }
+            }
+            else
+            {
+                uint32_t *puSample = (uint32_t *)pvBuf;
+                while (cFrames-- > 0)
+                {
+                    *puSample = (32760 << 16) /*Amplitude*/ * sin(rdFixed * iSrcFrame) + UINT32_C(0x80000000);
+                    iSrcFrame++;
+                    puSample = (uint32_t *)((uint8_t *)puSample + cbFrame);
+                }
+            }
+            break;
+
+        default:
+            AssertFailed();
     }
-
-    int rc = AudioHlpFileWrite(pStreamDbg->pFile, pvBuf, uBufSize, 0 /* fFlags */);
-    if (RT_FAILURE(rc))
-    {
-        LogRel(("DebugAudio: Writing input failed with %Rrc\n", rc));
-        return rc;
-    }
-
-    if (puRead)
-        *puRead = uBufSize;
-
-    return VINF_SUCCESS;
-}
-
-
-static int debugDestroyStreamIn(PDRVHOSTDEBUGAUDIO pDrv, PDEBUGAUDIOSTREAM pStreamDbg)
-{
-    RT_NOREF(pDrv, pStreamDbg);
-    return VINF_SUCCESS;
-}
-
-
-static int debugDestroyStreamOut(PDRVHOSTDEBUGAUDIO pDrv, PDEBUGAUDIOSTREAM pStreamDbg)
-{
-    RT_NOREF(pDrv, pStreamDbg);
-    return VINF_SUCCESS;
-}
-
-
-/**
- * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamDestroy}
- */
-static DECLCALLBACK(int) drvHostDebugAudioHA_StreamDestroy(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
-{
-    AssertPtrReturn(pInterface, VERR_INVALID_POINTER);
-
-    PDRVHOSTDEBUGAUDIO pDrv       = RT_FROM_MEMBER(pInterface, DRVHOSTDEBUGAUDIO, IHostAudio);
-    PDEBUGAUDIOSTREAM  pStreamDbg = (PDEBUGAUDIOSTREAM)pStream;
-
-    if (!pStreamDbg->pCfg) /* Not (yet) configured? Skip. */
-        return VINF_SUCCESS;
-
-    int rc;
-    if (pStreamDbg->pCfg->enmDir == PDMAUDIODIR_IN)
-        rc = debugDestroyStreamIn (pDrv, pStreamDbg);
+    pStreamDbg->In.uSample = iSrcFrame;
+
+    /*
+     * Write it.
+     */
+    int rc = AudioHlpFileWrite(pStreamDbg->pFile, pvBuf, cbBuf, 0 /* fFlags */);
+    if (RT_SUCCESS(rc))
+        *pcbRead = cbBuf;
     else
-        rc = debugDestroyStreamOut(pDrv, pStreamDbg);
-
-    if (RT_SUCCESS(rc))
-    {
-        AudioHlpFileDestroy(pStreamDbg->pFile);
-
-        PDMAudioStrmCfgFree(pStreamDbg->pCfg);
-        pStreamDbg->pCfg = NULL;
-    }
-
+        LogRelMax(32, ("DebugAudio: Writing input failed with %Rrc\n", rc));
     return rc;
-}
-
-
-/**
- * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamControl}
- */
-static DECLCALLBACK(int) drvHostDebugAudioHA_StreamControl(PPDMIHOSTAUDIO pInterface,
-                                                           PPDMAUDIOBACKENDSTREAM pStream, PDMAUDIOSTREAMCMD enmStreamCmd)
-{
-    RT_NOREF(enmStreamCmd);
-    AssertPtrReturn(pInterface, VERR_INVALID_POINTER);
-    AssertPtrReturn(pStream,    VERR_INVALID_POINTER);
-
-    return VINF_SUCCESS;
-}
-
-
-/**
- * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetReadable}
- */
-static DECLCALLBACK(uint32_t) drvHostDebugAudioHA_StreamGetReadable(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
-{
-    RT_NOREF(pInterface);
-
-    PDEBUGAUDIOSTREAM pStreamDbg = (PDEBUGAUDIOSTREAM)pStream;
-
-    AssertPtr(pStreamDbg->pCfg);
-
-    return PDMAudioPropsMilliToBytes(&pStreamDbg->pCfg->Props, 10 /*ms*/);
-}
-
-
-/**
- * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetWritable}
- */
-static DECLCALLBACK(uint32_t) drvHostDebugAudioHA_StreamGetWritable(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
-{
-    RT_NOREF(pInterface, pStream);
-
-    return UINT32_MAX;
-}
-
-
-/**
- * @interface_method_impl{PDMIHOSTAUDIO,pfnStreamGetWritable}
- */
-static DECLCALLBACK(PDMAUDIOSTREAMSTS) drvHostDebugAudioHA_StreamGetStatus(PPDMIHOSTAUDIO pInterface, PPDMAUDIOBACKENDSTREAM pStream)
-{
-    RT_NOREF(pInterface, pStream);
-
-    return PDMAUDIOSTREAMSTS_FLAGS_INITIALIZED | PDMAUDIOSTREAMSTS_FLAGS_ENABLED;
 }
 
@@ -379,4 +401,5 @@
     /* IHostAudio */
     pThis->IHostAudio.pfnGetConfig          = drvHostDebugAudioHA_GetConfig;
+    pThis->IHostAudio.pfnGetDevices         = NULL;
     pThis->IHostAudio.pfnGetStatus          = drvHostDebugAudioHA_GetStatus;
     pThis->IHostAudio.pfnStreamCreate       = drvHostDebugAudioHA_StreamCreate;
@@ -385,9 +408,8 @@
     pThis->IHostAudio.pfnStreamGetReadable  = drvHostDebugAudioHA_StreamGetReadable;
     pThis->IHostAudio.pfnStreamGetWritable  = drvHostDebugAudioHA_StreamGetWritable;
+    pThis->IHostAudio.pfnStreamGetPending   = drvHostDebugAudioHA_StreamGetPending;
     pThis->IHostAudio.pfnStreamGetStatus    = drvHostDebugAudioHA_StreamGetStatus;
     pThis->IHostAudio.pfnStreamPlay         = drvHostDebugAudioHA_StreamPlay;
     pThis->IHostAudio.pfnStreamCapture      = drvHostDebugAudioHA_StreamCapture;
-    pThis->IHostAudio.pfnGetDevices         = NULL;
-    pThis->IHostAudio.pfnStreamGetPending   = NULL;
 
 #ifdef VBOX_AUDIO_DEBUG_DUMP_PCM_DATA
