Index: roard/codecfilter.c
===================================================================
--- roard/codecfilter.c	(revision 2680)
+++ roard/codecfilter.c	(revision 2681)
@@ -184,4 +184,6 @@
   if ( g_codecfilter[i].subsystems & ROAR_SUBSYS_RAW )
    subsys[4] = 'R';
+  if ( g_codecfilter[i].subsystems & ROAR_SUBSYS_COMPLEX )
+   subsys[5] = 'X';
 
   flags = g_codecfilter[i].flags;
Index: roard/driver.c
===================================================================
--- roard/driver.c	(revision 2508)
+++ roard/driver.c	(revision 2681)
@@ -33,9 +33,9 @@
 #endif
  { "roar", "RoarAudio driver", "localhost, remote.host.dom", DRV_FLAG_NONE,
-   ROAR_SUBSYS_WAVEFORM|ROAR_SUBSYS_MIDI|ROAR_SUBSYS_LIGHT,
+   ROAR_SUBSYS_WAVEFORM|ROAR_SUBSYS_MIDI|ROAR_SUBSYS_LIGHT|ROAR_SUBSYS_COMPLEX,
    NULL, driver_roar_close, driver_roar_open_vio},
 #ifdef ROAR_HAVE_IO_POSIX
  { "raw",  "RAW PCM driver", "/some/file", DRV_FLAG_FHSEC,
-   ROAR_SUBSYS_WAVEFORM|ROAR_SUBSYS_MIDI|ROAR_SUBSYS_LIGHT|ROAR_SUBSYS_RAW,
+   ROAR_SUBSYS_WAVEFORM|ROAR_SUBSYS_MIDI|ROAR_SUBSYS_LIGHT|ROAR_SUBSYS_RAW|ROAR_SUBSYS_COMPLEX,
    NULL, NULL, driver_raw_open_vio},
 #endif
@@ -98,4 +98,6 @@
   if ( g_driver[i].subsystems & ROAR_SUBSYS_RAW )
    subsys[4] = 'R';
+  if ( g_driver[i].subsystems & ROAR_SUBSYS_COMPLEX )
+   subsys[5] = 'X';
 
   printf("  %-9s %c%c%c %6s - %s (devices: %s)\n", g_driver[i].name,
Index: roard/driver_roar.c
===================================================================
--- roard/driver_roar.c	(revision 2508)
+++ roard/driver_roar.c	(revision 2681)
@@ -34,9 +34,10 @@
  if ( sstream != NULL ) {
   switch (ROAR_STREAM(sstream)->dir) {
-   case ROAR_DIR_OUTPUT:    dir = ROAR_DIR_PLAY;     break;
-   case ROAR_DIR_MIDI_OUT:  dir = ROAR_DIR_MIDI_IN;  break;
-   case ROAR_DIR_LIGHT_OUT: dir = ROAR_DIR_LIGHT_IN; break;
+   case ROAR_DIR_OUTPUT:      dir = ROAR_DIR_PLAY;       break;
+   case ROAR_DIR_MIDI_OUT:    dir = ROAR_DIR_MIDI_IN;    break;
+   case ROAR_DIR_LIGHT_OUT:   dir = ROAR_DIR_LIGHT_IN;   break;
 // TODO: we need to know a real pos id for raw streams...
 //   case ROAR_DIR_RAW_OUT:   dir = ROAR_DIR_RAW_IN;   break;
+   case ROAR_DIR_COMPLEX_OUT: dir = ROAR_DIR_COMPLEX_IN; break;
    default:
      return -1;
Index: roard/include/roard.h
===================================================================
--- roard/include/roard.h	(revision 2674)
+++ roard/include/roard.h	(revision 2681)
@@ -70,4 +70,5 @@
 #define ROAR_SUBSYS_LIGHT         0x08
 #define ROAR_SUBSYS_RAW           0x10
+#define ROAR_SUBSYS_COMPLEX       0x20
 
 // some usefull macros:
Index: roard/req.c
===================================================================
--- roard/req.c	(revision 2630)
+++ roard/req.c	(revision 2681)
@@ -23,4 +23,5 @@
  */
 
+#define DEBUG
 #include "roard.h"
 
Index: roard/roard.c
===================================================================
--- roard/roard.c	(revision 2584)
+++ roard/roard.c	(revision 2681)
@@ -501,4 +501,6 @@
     dir = ROAR_DIR_RAW_OUT;
 #endif
+   } else if ( !strcasecmp(v, "complex") ) {
+    dir = ROAR_DIR_COMPLEX_OUT;
    } else {
     ROAR_ERR("add_output(*): unknown/unsupported subsystem '%s'", k);
Index: roard/sources.c
===================================================================
--- roard/sources.c	(revision 2507)
+++ roard/sources.c	(revision 2681)
@@ -65,4 +65,6 @@
   if ( g_source[i].subsystems & ROAR_SUBSYS_RAW )
    subsys[4] = 'R';
+  if ( g_source[i].subsystems & ROAR_SUBSYS_COMPLEX )
+   subsys[5] = 'X';
 
   printf("  %-9s %c%c%c %6s - %s (devices: %s)\n", g_source[i].name,
Index: roard/streams.c
===================================================================
--- roard/streams.c	(revision 2635)
+++ roard/streams.c	(revision 2681)
@@ -340,4 +340,8 @@
     return ROAR_SUBSYS_RAW;
    break;
+  case ROAR_DIR_COMPLEX_IN:
+  case ROAR_DIR_COMPLEX_OUT:
+    return ROAR_SUBSYS_COMPLEX;
+   break;
   case ROAR_DIR_THRU:
     return streams_get_subsys(ROAR_STREAM(ss)->pos_rel_id);
