Index: trunk/include/VBox/vmm/pdmaudioifs.h
===================================================================
--- trunk/include/VBox/vmm/pdmaudioifs.h	(revision 89216)
+++ trunk/include/VBox/vmm/pdmaudioifs.h	(revision 89218)
@@ -487,65 +487,59 @@
 typedef PDMAUDIOFRAME const *PCPDMAUDIOFRAME;
 
-/**
- * Audio playback destinations.
- */
-typedef enum PDMAUDIOPLAYBACKDST
-{
-    /** Invalid zero value as per usual (guards against using unintialized values). */
-    PDMAUDIOPLAYBACKDST_INVALID = 0,
-    /** Unknown destination. */
-    PDMAUDIOPLAYBACKDST_UNKNOWN,
-    /** Front channel. */
-    PDMAUDIOPLAYBACKDST_FRONT,
-    /** Center / LFE (Subwoofer) channel. */
-    PDMAUDIOPLAYBACKDST_CENTER_LFE,
-    /** Rear channel. */
-    PDMAUDIOPLAYBACKDST_REAR,
+
+/**
+ * Audio path: input sources and playback destinations.
+ *
+ * Think of this as the name of the socket you plug the virtual audio stream
+ * jack into.
+ *
+ * @note Not quite sure what the purpose of this type is.  It used to be two
+ * separate enums (PDMAUDIOPLAYBACKDST & PDMAUDIORECSRC) without overlapping
+ * values and most commonly used in a union (PDMAUDIODSTSRCUNION).  The output
+ * values were designated "channel" (e.g. "Front channel"), whereas this was not
+ * done to the input ones.  So, I'm (bird) a little confused what the actual
+ * meaning was.
+ */
+typedef enum PDMAUDIOPATH
+{
+    /** Customary invalid zero value. */
+    PDMAUDIOPATH_INVALID = 0,
+
+    /** Unknown path / Doesn't care. */
+    PDMAUDIOPATH_UNKNOWN,
+
+    /** First output value. */
+    PDMAUDIOPATH_OUT_FIRST,
+    /** Output: Front. */
+    PDMAUDIOPATH_OUT_FRONT = PDMAUDIOPATH_OUT_FIRST,
+    /** Output: Center / LFE (Subwoofer). */
+    PDMAUDIOPATH_OUT_CENTER_LFE,
+    /** Output: Rear. */
+    PDMAUDIOPATH_OUT_REAR,
+    /** Last output value (inclusive)   */
+    PDMAUDIOPATH_OUT_END = PDMAUDIOPATH_OUT_REAR,
+
+    /** First input value. */
+    PDMAUDIOPATH_IN_FIRST,
+    /** Input: Microphone. */
+    PDMAUDIOPATH_IN_MIC = PDMAUDIOPATH_IN_FIRST,
+    /** Input: CD. */
+    PDMAUDIOPATH_IN_CD,
+    /** Input: Video-In. */
+    PDMAUDIOPATH_IN_VIDEO,
+    /** Input: AUX. */
+    PDMAUDIOPATH_IN_AUX,
+    /** Input: Line-In. */
+    PDMAUDIOPATH_IN_LINE,
+    /** Input: Phone-In. */
+    PDMAUDIOPATH_IN_PHONE,
+    /** Last intput value (inclusive). */
+    PDMAUDIOPATH_IN_LAST = PDMAUDIOPATH_IN_PHONE,
+
     /** End of valid values. */
-    PDMAUDIOPLAYBACKDST_END,
-    /** Hack to blow the type up to 32-bit. */
-    PDMAUDIOPLAYBACKDST_32BIT_HACK = 0x7fffffff
-} PDMAUDIOPLAYBACKDST;
-
-/**
- * Audio recording sources.
- *
- * @note Because this is almost exclusively used in PDMAUDIODSTSRCUNION where it
- *       overlaps with PDMAUDIOPLAYBACKDST, the values starts at 64 instead of 0.
- */
-typedef enum PDMAUDIORECSRC
-{
-    /** Unknown recording source. */
-    PDMAUDIORECSRC_UNKNOWN = 64,
-    /** Microphone-In. */
-    PDMAUDIORECSRC_MIC,
-    /** CD. */
-    PDMAUDIORECSRC_CD,
-    /** Video-In. */
-    PDMAUDIORECSRC_VIDEO,
-    /** AUX. */
-    PDMAUDIORECSRC_AUX,
-    /** Line-In. */
-    PDMAUDIORECSRC_LINE,
-    /** Phone-In. */
-    PDMAUDIORECSRC_PHONE,
-    /** End of valid values. */
-    PDMAUDIORECSRC_END,
-    /** Hack to blow the type up to 32-bit. */
-    PDMAUDIORECSRC_32BIT_HACK = 0x7fffffff
-} PDMAUDIORECSRC;
-
-/**
- * Union for keeping an audio stream destination or source.
- */
-typedef union PDMAUDIODSTSRCUNION
-{
-    /** Desired playback destination (for an output stream). */
-    PDMAUDIOPLAYBACKDST enmDst;
-    /** Desired recording source (for an input stream). */
-    PDMAUDIORECSRC      enmSrc;
-} PDMAUDIODSTSRCUNION;
-/** Pointer to an audio stream src/dst union. */
-typedef PDMAUDIODSTSRCUNION *PPDMAUDIODSTSRCUNION;
+    PDMAUDIOPATH_END,
+    /** Hack to blow the typ up to 32 bits. */
+    PDMAUDIOPATH_32BIT_HACK = 0x7fffffff
+} PDMAUDIOPATH;
 
 /**
@@ -756,6 +750,6 @@
     /** Direction of the stream. */
     PDMAUDIODIR             enmDir;
-    /** Destination / source indicator, depending on enmDir. */
-    PDMAUDIODSTSRCUNION     u;
+    /** Destination / source path. */
+    PDMAUDIOPATH            enmPath;
     /** The stream's PCM properties. */
     PDMAUDIOPCMPROPS        Props;
@@ -1250,5 +1244,5 @@
 
 /** PDMIAUDIOCONNECTOR interface ID. */
-#define PDMIAUDIOCONNECTOR_IID                  "69d01cd1-df73-48db-86f4-2f97519ac585"
+#define PDMIAUDIOCONNECTOR_IID                  "ff9cabf0-4138-4c3a-aa99-28bf7a6feae7"
 
 
@@ -1531,5 +1525,5 @@
 
 /** PDMIHOSTAUDIO interface ID. */
-#define PDMIHOSTAUDIO_IID                           "cd27862d-9aa2-4270-876e-7d660b87ecd3"
+#define PDMIHOSTAUDIO_IID                           "ad56b303-0c1f-4b79-9bd1-4ec04ae08c4f"
 
 
@@ -1616,5 +1610,5 @@
 
 /** PDMIHOSTAUDIOPORT interface ID. */
-#define PDMIHOSTAUDIOPORT_IID                    "cd006383-7be1-4dbe-a69e-21236413cf30"
+#define PDMIHOSTAUDIOPORT_IID                    "9f91ec59-95ba-4925-92dc-e75be1c63352"
 
 /** @} */
Index: trunk/include/VBox/vmm/pdmaudioinline.h
===================================================================
--- trunk/include/VBox/vmm/pdmaudioinline.h	(revision 89216)
+++ trunk/include/VBox/vmm/pdmaudioinline.h	(revision 89218)
@@ -107,49 +107,33 @@
 
 /**
- * Gets the name of a playback destination enum value.
+ * Gets the name of a path enum value.
  *
  * @returns Pointer to read-only name, "bad" if invalid input.
- * @param   enmPlaybackDst      The playback destination value.
- */
-DECLINLINE(const char *) PDMAudioPlaybackDstGetName(PDMAUDIOPLAYBACKDST enmPlaybackDst)
-{
-    switch (enmPlaybackDst)
-    {
-        case PDMAUDIOPLAYBACKDST_UNKNOWN:    return "Unknown";
-        case PDMAUDIOPLAYBACKDST_FRONT:      return "Front";
-        case PDMAUDIOPLAYBACKDST_CENTER_LFE: return "Center / LFE";
-        case PDMAUDIOPLAYBACKDST_REAR:       return "Rear";
+ * @param   enmPath     The path value to name.
+ */
+DECLINLINE(const char *) PDMAudioPathGetName(PDMAUDIOPATH enmPath)
+{
+    switch (enmPath)
+    {
+        case PDMAUDIOPATH_UNKNOWN:          return "Unknown";
+
+        case PDMAUDIOPATH_OUT_FRONT:        return "Front";
+        case PDMAUDIOPATH_OUT_CENTER_LFE:   return "Center / LFE";
+        case PDMAUDIOPATH_OUT_REAR:         return "Rear";
+
+        case PDMAUDIOPATH_IN_MIC:           return "Microphone In";
+        case PDMAUDIOPATH_IN_CD:            return "CD";
+        case PDMAUDIOPATH_IN_VIDEO:         return "Video";
+        case PDMAUDIOPATH_IN_AUX:           return "AUX";
+        case PDMAUDIOPATH_IN_LINE:          return "Line In";
+        case PDMAUDIOPATH_IN_PHONE:         return "Phone";
+
         /* no default */
-        case PDMAUDIOPLAYBACKDST_INVALID:
-        case PDMAUDIOPLAYBACKDST_END:
-        case PDMAUDIOPLAYBACKDST_32BIT_HACK:
+        case PDMAUDIOPATH_INVALID:
+        case PDMAUDIOPATH_END:
+        case PDMAUDIOPATH_32BIT_HACK:
             break;
     }
-    AssertMsgFailedReturn(("Invalid playback destination %ld\n", enmPlaybackDst), "bad");
-}
-
-/**
- * Gets the name of a recording source enum value.
- *
- * @returns Pointer to read-only name, "bad" if invalid input.
- * @param   enmRecSrc       The recording source value.
- */
-DECLINLINE(const char *) PDMAudioRecSrcGetName(PDMAUDIORECSRC enmRecSrc)
-{
-    switch (enmRecSrc)
-    {
-        case PDMAUDIORECSRC_UNKNOWN: return "Unknown";
-        case PDMAUDIORECSRC_MIC:     return "Microphone In";
-        case PDMAUDIORECSRC_CD:      return "CD";
-        case PDMAUDIORECSRC_VIDEO:   return "Video";
-        case PDMAUDIORECSRC_AUX:     return "AUX";
-        case PDMAUDIORECSRC_LINE:    return "Line In";
-        case PDMAUDIORECSRC_PHONE:   return "Phone";
-        /* no default */
-        case PDMAUDIORECSRC_END:
-        case PDMAUDIORECSRC_32BIT_HACK:
-            break;
-    }
-    AssertMsgFailedReturn(("Invalid recording source %ld\n", enmRecSrc), "bad");
+    AssertMsgFailedReturn(("Unknown enmPath=%d\n", enmPath), "bad");
 }
 
@@ -954,5 +938,5 @@
     if (PDMAudioPropsAreEqual(&pCfg1->Props, &pCfg2->Props))
         return pCfg1->enmDir    == pCfg2->enmDir
-            && pCfg1->u.enmDst  == pCfg2->u.enmDst
+            && pCfg1->enmPath   == pCfg2->enmPath
             && pCfg1->enmLayout == pCfg2->enmLayout
             && pCfg1->Device.cMsSchedulingHint == pCfg2->Device.cMsSchedulingHint
