[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cdi-devel] [PATCH] CDI.audio



From: Max Reitz <max@xxxxxxxxxx>

+ A new approach on CDI.audio (aka CDI.sound). Up to now, it just
  consists of a single C header describing the interface between
  operating system and sound driver.

Signed-off-by: Max Reitz <max@xxxxxxxxxx>
---
 include/cdi.h       |    2 +
 include/cdi/audio.h |  147 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 149 insertions(+), 0 deletions(-)
 create mode 100644 include/cdi/audio.h

diff --git a/include/cdi.h b/include/cdi.h
index d803751..0b8e468 100644
--- a/include/cdi.h
+++ b/include/cdi.h
@@ -19,12 +19,14 @@
 #include "cdi/lists.h"
 
 #define CDI_STANDALONE
+#define TYNDUR
 
 typedef enum {
     CDI_UNKNOWN         = 0,
     CDI_NETWORK         = 1,
     CDI_STORAGE         = 2,
     CDI_SCSI            = 3,
+    CDI_AUDIO           = 4,
 } cdi_device_type_t;
 
 struct cdi_driver;
diff --git a/include/cdi/audio.h b/include/cdi/audio.h
new file mode 100644
index 0000000..bd1fb1a
--- /dev/null
+++ b/include/cdi/audio.h
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2009 Max Reitz
+ *
+ * This program is free software. It comes without any warranty, to
+ * the extent permitted by applicable law. You can redistribute it 
+ * and/or modify it under the terms of the Do What The Fuck You Want 
+ * To Public License, Version 2, as published by Sam Hocevar. See
+ * http://sam.zoy.org/projects/COPYING.WTFPL for more details.
+ */
+
+/**
+ * Treiber fuer Soundkarten
+ * \defgroup net
+ */
+/*\@{*/
+
+#ifndef _CDI_AUDIO_H_
+#define _CDI_AUDIO_H_
+
+#include <stddef.h>
+
+#include "cdi.h"
+#include "cdi/list.h"
+
+//Moegliche Operation
+typedef enum {
+    //Abspielen
+    CDI_AUDIO_PLAY = 0,
+    //Aufnehmen
+    CDI_AUDIO_RECORD,
+
+    CDI_AUDIO_NUM_ACTIONS
+} cdi_audio_action_t;
+
+struct cdi_audio_device {
+    struct cdi_device dev;
+
+    //Unterstuetzte Modi fuer eine bestimmte Operation. Ist dieser Wert NULL
+    //oder die Liste ganz einfach leer, dann wird die Operation nicht
+    //unterstuetzt.
+    cdi_list_t        modes[CDI_AUDIO_NUM_ACTIONS];
+};
+
+struct cdi_audio_mode {
+    //Samplerate
+    int sample_rate;
+    //Anzahl der Channels (1 = Mono; 2 = Stereo; ...)
+    int channels;
+    //Bits pro Sample
+    int bits_per_sample;
+};
+
+struct cdi_audio_driver {
+    struct cdi_driver drv;
+
+    /**
+     * Aendert den Modus der Soundkarte fuer eine bestimmte Operation
+     *
+     * @param device Soundkarte
+     * @param action Betreffende Operation
+     * @param mode Gewuenschter Modus (muss in device->modes[action] enthalten
+     *             sein!)
+     *
+     * @return 0, wenn der neue Modus dem angegebenen entspricht, sonst -1.
+     */
+    int (*change_mode)(struct cdi_audio_device* device,
+        cdi_audio_action_t action, struct cdi_audio_mode* mode);
+
+    /**
+     * Liefert den Modus der Soundkarte fuer eine bestimmte Operation
+     *
+     * @param device Soundkarte
+     * @param action Betreffende Operation
+     * @param mode Pointer zur Struktur, in der die Informationen zum Modus
+     *             hinterlegt werden sollen
+     *
+     * @return 0, wenn die Informationen in *mode gespeichert wurden, sonst -1.
+     */
+    int (*get_mode)(struct cdi_audio_device* device, cdi_audio_action_t action,
+        struct cdi_audio_mode* mode);
+
+    /**
+     * Legt die Lautstaerke der angegebenen Operation fest
+     *
+     * @param device Soundkarte
+     * @param action Betreffende Operation
+     * @param volume Neue Lautstaerke (zwischen 0 und 255, wobei 255 am
+     *               lautesten ist; bei -1 wird die Lautstaerke nicht
+     *               veraendert)
+     *
+     * @return Die neue Lautstaerke (nuetzlich mit volume == -1)
+     */
+    int (*set_volume)(struct cdi_audio_device* device,
+        cdi_audio_action_t action, int volume);
+
+    /**
+     * Fuehrt eine Operation aus
+     *
+     * @param device Soundkarte
+     * @param action Auszufuehrende Operation
+     * @param buffer Speicher, in dem die Operation durchgefuehrt werden soll
+     * @param size Groesse des Speichers
+     * @param flags Eventuelle Flags, die die Operation genauer festlegen
+     *
+     * @return 0 bei Erfolg, -1 im Fehlerfall.
+     */
+    int (*act)(struct cdi_audio_device* device, cdi_audio_action_t action,
+        void* buffer, size_t size, int flags);
+
+    /**
+     * Bricht eine Operation ab
+     *
+     * @param device Soundkarte
+     * @param action Abzubrechende Operation
+     */
+    void (*cancel)(struct cdi_audio_device* device, cdi_audio_action_t action);
+};
+
+//Flags fuer act():
+#define CDI_AUDIO_LOOP 0x00000001 //Fuehrt die Operation in einer ewigen
+                                  //Schleife aus (mit cancel() zu unterbrechen)
+
+
+/**
+ * Initialisiert die Datenstrukturen fuer einen Soundkartentreiber
+ * (erzeugt die devices-Liste)
+ *
+ * @param driver Der Treiber
+ */
+void cdi_audio_driver_init(struct cdi_net_driver* driver);
+
+/**
+ * Deinitialisiert die Datenstrukturen fuer einen Soundkartentreiber
+ * (gibt die devices-Liste frei)
+ *
+ * @param driver Der Treiber
+ */
+void cdi_audio_driver_destroy(struct cdi_net_driver* driver);
+
+/**
+ * Initialisiert eine neue Soundkarte
+ *
+ * @param device Die Soundkarte
+ */
+void cdi_audio_device_init(struct cdi_audio_device* device);
+
+#endif
-- 
1.6.3.3