Index: /trunk/src/VBox/Devices/Audio/DevCodec.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevCodec.cpp	(revision 37189)
+++ /trunk/src/VBox/Devices/Audio/DevCodec.cpp	(revision 37190)
@@ -32,4 +32,5 @@
 #define CODECNODE_F0_PARAM_LENGTH 0x14
 #define CODECNODE_F02_PARAM_LENGTH 16
+
 typedef struct CODECCOMMONNODE
 {
@@ -1835,7 +1836,52 @@
 }
 
-int codecLoadState(CODECState *pCodecState, PSSMHANDLE pSSMHandle)
-{
-    int rc = SSMR3GetMem (pSSMHandle, pCodecState->pNodes, sizeof(CODECNODE) * pCodecState->cTotalNodes);
+static DECLCALLBACK(int)codecLoadV1(PCODECState pCodecState, PSSMHANDLE pSSMHandle, size_t cbOffset)
+{
+    size_t cbRawNodesV1 = (sizeof(CODECNODE) + cbOffset) * pCodecState->cTotalNodes;
+    uint8_t *pu8RawNodesV1 = (uint8_t *)RTMemAlloc(cbRawNodesV1);
+    uint8_t *pu8NodeV1 = NULL;
+    int idxNode = 0;
+    if (!pu8RawNodesV1)
+        return VERR_NO_MEMORY;
+    int rc = SSMR3GetMem (pSSMHandle, pu8RawNodesV1, cbRawNodesV1);
+
+    if (RT_FAILURE(rc))
+    {
+        RTMemFree(pu8RawNodesV1);
+        AssertRCReturn(rc, rc);
+    }
+    pu8NodeV1 = &pu8RawNodesV1[0];
+    for (idxNode = 0; idxNode < pCodecState->cTotalNodes; ++idxNode)
+    {
+        pCodecState->pNodes[idxNode].node.id = pu8NodeV1[0];
+        memcpy(pCodecState->pNodes[idxNode].node.au32F00_param,
+               pu8NodeV1 + RT_OFFSETOF(CODECCOMMONNODE, au32F00_param),
+               sizeof(CODECNODE) - RT_OFFSETOF(CODECCOMMONNODE,au32F00_param));
+        pu8NodeV1 += sizeof(CODECNODE) + cbOffset;
+    }
+
+    RTMemFree(pu8RawNodesV1);
+    return rc;
+}
+
+int codecLoadState(CODECState *pCodecState, PSSMHANDLE pSSMHandle, uint32_t uVersion)
+{
+    int rc;
+    if (uVersion == 1)
+    {
+#if RT_ARCH_X86
+        if (SSMR3HandleHostBits(pSSMHandle) == 32)
+            rc = codecLoadV1(pCodecState, pSSMHandle, sizeof(long));
+        else
+            rc = codecLoadV1(pCodecState, pSSMHandle, sizeof(uint64_t));
+#else
+        if (SSMR3HandleHostBits(pSSMHandle) == 64)
+            rc = codecLoadV1(pCodecState, pSSMHandle, sizeof(long));
+        else
+            rc = codecLoadV1(pCodecState, pSSMHandle, sizeof(uint32_t));
+#endif
+    }
+    else
+        rc = SSMR3GetMem (pSSMHandle, pCodecState->pNodes, sizeof(CODECNODE) * pCodecState->cTotalNodes);
     if (codecIsDacNode(pCodecState, pCodecState->u8DacLineOut))
         codecToAudVolume(&pCodecState->pNodes[pCodecState->u8DacLineOut].dac.B_params, AUD_MIXER_VOLUME);
Index: /trunk/src/VBox/Devices/Audio/DevCodec.h
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevCodec.h	(revision 37189)
+++ /trunk/src/VBox/Devices/Audio/DevCodec.h	(revision 37190)
@@ -527,6 +527,8 @@
 int codecDestruct(CODECState *pCodecState);
 int codecSaveState(CODECState *pCodecState, PSSMHANDLE pSSMHandle);
-int codecLoadState(CODECState *pCodecState, PSSMHANDLE pSSMHandle);
+int codecLoadState(CODECState *pCodecState, PSSMHANDLE pSSMHandle, uint32_t uVersion);
 int codecOpenVoice(CODECState *pCodecState, ENMSOUNDSOURCE enmSoundSource, audsettings_t *pAudioSettings);
+
+#define HDA_SSM_VERSION 2
 
 # ifdef VBOX_WITH_HDA_CODEC_EMU
Index: /trunk/src/VBox/Devices/Audio/DevIchIntelHDA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DevIchIntelHDA.cpp	(revision 37189)
+++ /trunk/src/VBox/Devices/Audio/DevIchIntelHDA.cpp	(revision 37190)
@@ -53,5 +53,4 @@
 #endif
 
-#define HDA_SSM_VERSION 2
 PDMBOTHCBDECL(int) hdaMMIORead(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb);
 PDMBOTHCBDECL(int) hdaMMIOWrite(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb);
@@ -1996,9 +1995,9 @@
     PCIINTELHDLinkState *pThis = PDMINS_2_DATA(pDevIns, PCIINTELHDLinkState *);
     /* Load Codec nodes states */
-    if (uVersion < HDA_SSM_VERSION)
+    if (uVersion > HDA_SSM_VERSION)
         return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
     Assert (uPass == SSM_PASS_FINAL); NOREF(uPass);
 
-    codecLoadState(&pThis->hda.Codec, pSSMHandle);
+    codecLoadState(&pThis->hda.Codec, pSSMHandle, uVersion);
     /* Load MMIO registers */
     SSMR3GetMem (pSSMHandle, pThis->hda.au32Regs, sizeof (pThis->hda.au32Regs));
