Move sb16_nt4 and sndblst out of the way in preparation of a decent rewrite.
[reactos.git] / reactos / drivers / multimedia / audio / sndblst.old / portio.c
diff --git a/reactos/drivers/multimedia/audio/sndblst.old/portio.c b/reactos/drivers/multimedia/audio/sndblst.old/portio.c
new file mode 100644 (file)
index 0000000..9ede535
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ *
+ * COPYRIGHT:            See COPYING in the top level directory
+ * PROJECT:              ReactOS kernel
+ * FILE:                 drivers/dd/sndblst/portio.c (see also sndblst.h)
+ * PURPOSE:              Sound Blaster port I/O helper
+ * PROGRAMMER:           Andrew Greenwood
+ * UPDATE HISTORY:
+ *                       Sept 28, 2003: Created
+ */
+
+#include <ntddk.h>
+#include "sndblst.h"
+
+BOOLEAN WaitToSend(ULONG BasePort)
+{
+    int TimeOut;
+
+    DPRINT("WaitToSend ");
+
+    // Check if it's OK to send
+    for (TimeOut = SB_TIMEOUT;
+         ! SB_READY_TO_SEND(BasePort) && TimeOut > 0;
+         TimeOut --);
+
+    // If a time-out occurs, we report failure
+    if (! TimeOut)
+    {
+        DPRINT("FAILED\n");
+        return FALSE;
+    }
+
+    DPRINT("SUCCEEDED\n");
+
+    return TRUE;
+}
+
+BOOLEAN WaitToReceive(ULONG BasePort)
+{
+    int TimeOut;
+
+    DPRINT("WaitToReceive ");
+
+    // Check if it's OK to receive
+    for (TimeOut = SB_TIMEOUT;
+         ! SB_READY_TO_RECEIVE(BasePort) && TimeOut > 0;
+         TimeOut --);
+
+    // If a time-out occurs, we report failure
+    if (! TimeOut)
+    {
+        DPRINT("FAILED\n");
+        return FALSE;
+    }
+
+    DPRINT("SUCCEEDED\n");
+
+    return TRUE;
+}
+
+
+USHORT InitSoundCard(ULONG BasePort)
+{
+    ULONG TimeOut;
+    BOOLEAN Status;
+    UCHAR DSP_Major, DSP_Minor;
+
+    DPRINT("InitSoundCard() called\n");
+
+    DPRINT("Resetting sound card\n");
+//    if (!WaitToSend(BasePort))
+//        return FALSE;
+
+    SB_WRITE_RESET(BasePort, 0x01);
+    for (TimeOut = 0; TimeOut < 30000; TimeOut ++); // Wait a while
+    SB_WRITE_RESET(BasePort, 0x00);
+
+    // Check if it's OK to receive (some cards will ignore the above reset
+    // command and so will not issue an ACK, so time out is NOT an error)
+    DPRINT("Waiting for an ACK\n");
+    if (WaitToReceive(BasePort))
+    {
+        // Check to make sure the reset was acknowledged:
+        for (TimeOut = SB_TIMEOUT;
+             (Status = (SB_READ_DATA(BasePort) != SB_DSP_READY) && (TimeOut > 0));
+             TimeOut --);
+    }
+
+    DPRINT("Querying DSP version\n");
+    if (! WaitToSend(BasePort))
+        return FALSE;
+
+    SB_WRITE_DATA(BasePort, SB_GET_DSP_VERSION);
+
+    if (! WaitToReceive(BasePort))
+        return FALSE;
+
+    DSP_Major = SB_READ_DATA(BasePort);
+    DSP_Minor = SB_READ_DATA(BasePort);
+
+    DPRINT("DSP v%d.%d\n", DSP_Major, DSP_Minor);
+
+    // if audio is disabled,
+    // version tests return 0xFF everywhere
+    if (DSP_Major == 0xFF && DSP_Minor == 0xFF)
+        return FALSE;
+
+    DPRINT("Sound card initialized!\n");
+
+    return (DSP_Major * 256) + DSP_Minor;
+}