Index: /trunk/src/VBox/Devices/Audio/AudioTest.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/AudioTest.cpp	(revision 89138)
+++ /trunk/src/VBox/Devices/Audio/AudioTest.cpp	(revision 89139)
@@ -55,4 +55,7 @@
 /** The current test manifest version. */
 #define AUDIOTEST_MANIFEST_VER      1
+/** Audio test archive default suffix.
+ *  According to IPRT terminology this always contains the dot. */
+#define AUDIOTEST_ARCHIVE_SUFF_STR  ".tar.gz"
 
 /** Test manifest header name. */
@@ -779,4 +782,7 @@
         return VINF_SUCCESS;
 
+    if (!RTFileIsValid(pSet->f.hFile))
+        return VINF_SUCCESS;
+
     /* Update number of ran tests. */
     int rc = RTFileSeek(pSet->f.hFile, pSet->offTestCount, RTFILE_SEEK_BEGIN, NULL);
@@ -785,9 +791,6 @@
     AssertRCReturn(rc, rc);
 
-    if (RTFileIsValid(pSet->f.hFile))
-    {
-        RTFileClose(pSet->f.hFile);
-        pSet->f.hFile = NIL_RTFILE;
-    }
+    RTFileClose(pSet->f.hFile);
+    pSet->f.hFile = NIL_RTFILE;
 
     return rc;
@@ -1033,5 +1036,6 @@
 
     char szOutName[RT_ELEMENTS(AUDIOTEST_PATH_PREFIX_STR) + AUDIOTEST_TAG_MAX + 16];
-    if (RTStrPrintf2(szOutName, sizeof(szOutName), "%s-%s.tar.gz", AUDIOTEST_PATH_PREFIX_STR, pSet->szTag) <= 0)
+    if (RTStrPrintf2(szOutName, sizeof(szOutName), "%s-%s%s",
+                     AUDIOTEST_PATH_PREFIX_STR, pSet->szTag, AUDIOTEST_ARCHIVE_SUFF_STR) <= 0)
         AssertFailedReturn(VERR_BUFFER_OVERFLOW);
 
@@ -1066,8 +1070,21 @@
 
 /**
+ * Returns whether a test set archive is packed (as .tar.gz by default) or
+ * a plain directory.
+ *
+ * @returns \c true if packed (as .tar.gz), or \c false if not (directory).
+ * @param   pszPath             Path to return packed staus for.
+ */
+bool AudioTestSetIsPacked(const char *pszPath)
+{
+    /** @todo Improve this, good enough for now. */
+    return (RTStrIStr(pszPath, AUDIOTEST_ARCHIVE_SUFF_STR) != NULL);
+}
+
+/**
  * Unpacks a formerly packed audio test set.
  *
  * @returns VBox status code.
- * @param   pszFile             Test set file to unpack.
+ * @param   pszFile             Test set file to unpack. Must contain the absolute path.
  * @param   pszOutDir           Directory where to unpack the test set into.
  *                              If the directory does not exist it will be created.
@@ -1075,9 +1092,31 @@
 int AudioTestSetUnpack(const char *pszFile, const char *pszOutDir)
 {
-    RT_NOREF(pszFile, pszOutDir);
-
-    // RTZipTarCmd()
-
-    return VERR_NOT_IMPLEMENTED;
+    AssertReturn(pszFile && pszOutDir, VERR_INVALID_PARAMETER);
+
+    int rc = VINF_SUCCESS;
+
+    if (!RTDirExists(pszOutDir))
+    {
+        rc = RTDirCreateFullPath(pszOutDir, 0755);
+        if (RT_FAILURE(rc))
+            return rc;
+    }
+
+    const char *apszArgs[8];
+    unsigned    cArgs = 0;
+
+    apszArgs[cArgs++] = "AudioTest";
+    apszArgs[cArgs++] = "--extract";
+    apszArgs[cArgs++] = "--gunzip";
+    apszArgs[cArgs++] = "--directory";
+    apszArgs[cArgs++] = pszOutDir;
+    apszArgs[cArgs++] = "--file";
+    apszArgs[cArgs++] = pszFile;
+
+    RTEXITCODE rcExit = RTZipTarCmd(cArgs, (char **)apszArgs);
+    if (rcExit != RTEXITCODE_SUCCESS)
+        rc = VERR_GENERAL_FAILURE; /** @todo Fudge! */
+
+    return rc;
 }
 
Index: /trunk/src/VBox/Devices/Audio/AudioTest.h
===================================================================
--- /trunk/src/VBox/Devices/Audio/AudioTest.h	(revision 89138)
+++ /trunk/src/VBox/Devices/Audio/AudioTest.h	(revision 89139)
@@ -27,9 +27,9 @@
 
 /** Maximum length in characters an audio test tag can have. */
-#define AUDIOTEST_TAG_MAX          64
+#define AUDIOTEST_TAG_MAX               64
 /** Maximum length in characters a single audio test error description can have. */
-#define AUDIOTEST_ERROR_DESC_MAX   128
+#define AUDIOTEST_ERROR_DESC_MAX        128
 /** Prefix for audio test (set) directories. */
-#define AUDIOTEST_PATH_PREFIX_STR "vkat"
+#define AUDIOTEST_PATH_PREFIX_STR       "vkat"
 
 /**
@@ -324,4 +324,5 @@
 int    AudioTestSetClose(PAUDIOTESTSET pSet);
 int    AudioTestSetWipe(PAUDIOTESTSET pSet);
+bool   AudioTestSetIsPacked(const char *pszPath);
 int    AudioTestSetPack(PAUDIOTESTSET pSet, const char *pszOutDir, char *pszFileName, size_t cbFileName);
 int    AudioTestSetUnpack(const char *pszFile, const char *pszOutDir);
Index: /trunk/src/VBox/ValidationKit/utils/audio/vkat.cpp
===================================================================
--- /trunk/src/VBox/ValidationKit/utils/audio/vkat.cpp	(revision 89138)
+++ /trunk/src/VBox/ValidationKit/utils/audio/vkat.cpp	(revision 89139)
@@ -31,4 +31,5 @@
 #include <iprt/buildconfig.h>
 #include <iprt/ctype.h>
+#include <iprt/dir.h>
 #include <iprt/errcore.h>
 #include <iprt/initterm.h>
@@ -1942,8 +1943,44 @@
 static int audioVerifyOne(const char *pszPath, const char *pszTag)
 {
-    RTTestSubF(g_hTest, "Verifying test set (tag '%s') ...", pszTag ? pszTag : "default");
+    RTTestSubF(g_hTest, "Verifying test set ...");
+
+    RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Using tag '%s'\n", pszTag ? pszTag : "default");
+    RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Opening archive '%s'\n", pszPath);
+
+    int rc = VINF_SUCCESS;
+
+    char szPathExtracted[RTPATH_MAX];
+    const bool fPacked = AudioTestSetIsPacked(pszPath);
+    if (fPacked)
+    {
+        char szPathTemp[RTPATH_MAX];
+        rc = RTPathTemp(szPathTemp, sizeof(szPathTemp));
+        if (RT_SUCCESS(rc))
+        {
+            RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Using temporary directory '%s'\n", szPathTemp);
+
+            rc = RTPathJoin(szPathExtracted, sizeof(szPathExtracted), szPathTemp, "vkat-XXXX");
+            if (RT_SUCCESS(rc))
+            {
+                rc = RTDirCreateTemp(szPathExtracted, 0755);
+                if (RT_SUCCESS(rc))
+                {
+                    RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Unpacking archive to '%s'\n", szPathExtracted);
+                    rc = AudioTestSetUnpack(pszPath, szPathExtracted);
+                    if (RT_SUCCESS(rc))
+                        RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Archive successfully unpacked\n");
+                }
+            }
+        }
+    }
+
+    if (RT_FAILURE(rc))
+    {
+        RTTestFailed(g_hTest, "Unable to open / unpack test set archive: %Rrc", rc);
+        return rc;
+    }
 
     AUDIOTESTSET tstSet;
-    int rc = AudioTestSetOpen(&tstSet, pszPath);
+    rc = AudioTestSetOpen(&tstSet, fPacked ? szPathExtracted : pszPath);
     if (RT_SUCCESS(rc))
     {
@@ -2027,6 +2064,8 @@
             RTTestBanner(g_hTest);
         char szDirCur[RTPATH_MAX];
-        rc = RTPathGetCurrent(szDirCur, sizeof(szDirCur));
-        audioVerifyOne(RT_SUCCESS(rc) ? szDirCur : ".", pszTag);
+        int rc2 = RTPathGetCurrent(szDirCur, sizeof(szDirCur));
+        if (RT_FAILURE(rc2))
+            RTTestFailed(g_hTest, "Failed to retrieve current directory: %Rrc", rc2);
+        rc = audioVerifyOne(RT_SUCCESS(rc2) ? szDirCur : ".", pszTag);
     }
 
@@ -2279,10 +2318,10 @@
     {
         "test",     audioTestMain,
-        "Does some kind of testing, I guess...",
+        "Runs audio tests and creates an audio test set.",
         g_aCmdTestOptions,      RT_ELEMENTS(g_aCmdTestOptions),     audioTestCmdTestHelp
     },
     {
         "verify",   audioVerifyMain,
-        "Verfies something, I guess...",
+        "Verifies a formerly created audio test set.",
         g_aCmdVerifyOptions,    RT_ELEMENTS(g_aCmdVerifyOptions),   NULL,
     },
