]> git.0d.be Git - jack_mixer.git/commitdiff
Add possibility to have output channels mixing channels *prefader*
authorFrédéric Péters <fpeters@0d.be>
Fri, 11 Dec 2009 16:19:04 +0000 (17:19 +0100)
committerFrédéric Péters <fpeters@0d.be>
Fri, 11 Dec 2009 16:19:04 +0000 (17:19 +0100)
jack_mixer.c
jack_mixer.h
jack_mixer_c.c

index 92da87ca3d43bbcf5526fbdd1345904fa8707c2b..7e85b1a7029a0dc6d00948d35fad6fb05d594793 100644 (file)
@@ -68,6 +68,8 @@ struct channel
 
   jack_default_audio_sample_t * frames_left;
   jack_default_audio_sample_t * frames_right;
+  jack_default_audio_sample_t * prefader_frames_left;
+  jack_default_audio_sample_t * prefader_frames_right;
 
   bool NaN_detected;
 
@@ -90,6 +92,7 @@ struct output_channel {
   GSList *soloed_channels;
   GSList *muted_channels;
   bool system; /* system channel, without any associated UI */
+  bool prefader;
 };
 
 struct jack_mixer
@@ -505,14 +508,22 @@ mix_one(
 
     for (i = start ; i < end ; i++)
     {
-      frame_left = channel_ptr->frames_left[i-start];
+      if (! output_mix_channel->prefader) {
+        frame_left = channel_ptr->frames_left[i-start];
+      } else {
+        frame_left = channel_ptr->prefader_frames_left[i-start];
+      }
       if (frame_left == NAN)
         break;
       mix_channel->left_buffer_ptr[i] += frame_left;
 
       if (mix_channel->stereo)
       {
-        frame_right = channel_ptr->frames_right[i-start];
+        if (! output_mix_channel->prefader) {
+          frame_right = channel_ptr->frames_right[i-start];
+        } else {
+          frame_right = channel_ptr->prefader_frames_right[i-start];
+        }
         if (frame_right == NAN)
           break;
 
@@ -526,11 +537,13 @@ mix_one(
   /* process main mix channel */
   for (i = start ; i < end ; i++)
   {
+    if (! output_mix_channel->prefader) {
     mix_channel->left_buffer_ptr[i] *= mix_channel->volume_left;
     if (mix_channel->stereo)
     {
       mix_channel->right_buffer_ptr[i] *= mix_channel->volume_right;
     }
+    }
 
     frame_left = fabsf(mix_channel->left_buffer_ptr[i]);
     if (mix_channel->peak_left < frame_left)
@@ -589,8 +602,15 @@ calc_channel_frames(
   channel_ptr->frames_left = calloc(end-start, sizeof(jack_default_audio_sample_t));
   channel_ptr->frames_right = calloc(end-start, sizeof(jack_default_audio_sample_t));
 
+  channel_ptr->prefader_frames_left = calloc(end-start, sizeof(jack_default_audio_sample_t));
+  channel_ptr->prefader_frames_right = calloc(end-start, sizeof(jack_default_audio_sample_t));
+
   for (i = start ; i < end ; i++)
   {
+    channel_ptr->prefader_frames_left[i-start] = channel_ptr->left_buffer_ptr[i];
+    if (channel_ptr->stereo)
+      channel_ptr->prefader_frames_right[i-start] = channel_ptr->right_buffer_ptr[i];
+
     if (!FLOAT_EXISTS(channel_ptr->left_buffer_ptr[i]))
     {
       channel_ptr->NaN_detected = true;
@@ -724,6 +744,8 @@ mix(
     channel_ptr = (struct channel*)node_ptr->data;
     free(channel_ptr->frames_left);
     free(channel_ptr->frames_right);
+    free(channel_ptr->prefader_frames_left);
+    free(channel_ptr->prefader_frames_right);
   }
 }
 
@@ -1199,6 +1221,7 @@ create_output_channel(
   output_channel_ptr->soloed_channels = NULL;
   output_channel_ptr->muted_channels = NULL;
   output_channel_ptr->system = system;
+  output_channel_ptr->prefader = false;
 
   return output_channel_ptr;
 
@@ -1338,3 +1361,20 @@ output_channel_is_solo(
   return false;
 }
 
+void
+output_channel_set_prefader(
+  jack_mixer_output_channel_t output_channel,
+  bool pfl_value)
+{
+  struct output_channel *output_channel_ptr = output_channel;
+  output_channel_ptr->prefader = pfl_value;
+}
+
+bool
+output_channel_is_prefader(
+  jack_mixer_output_channel_t output_channel)
+{
+  struct output_channel *output_channel_ptr = output_channel;
+  return output_channel_ptr->prefader;
+}
+
index 7d85d875af8a13bde6de5e79618aed3de103b9ae..bdd820794290501129d01b250a7dc1515bdc4b49 100644 (file)
@@ -241,4 +241,13 @@ output_channel_is_solo(
   jack_mixer_output_channel_t output_channel,
   jack_mixer_channel_t channel);
 
+void
+output_channel_set_prefader(
+  jack_mixer_output_channel_t output_channel,
+  bool pfl_value);
+
+bool
+output_channel_is_prefader(
+  jack_mixer_output_channel_t output_channel);
+
 #endif /* #ifndef JACK_MIXER_H__DAEB51D8_5861_40F2_92E4_24CA495A384D__INCLUDED */
index c1ba4b8197ce0b05eb8b7f8a3f56bad5212d517d..a1b400e0bfd15aaa5d088d4bab98535ac2a28ce1 100644 (file)
@@ -563,6 +563,38 @@ typedef struct {
        jack_mixer_output_channel_t *output_channel;
 } OutputChannelObject;
 
+static int
+OutputChannel_set_prefader(OutputChannelObject *self, PyObject *value, void *closure)
+{
+       if (value == Py_True) {
+               output_channel_set_prefader(self->output_channel, true);
+       } else {
+               output_channel_set_prefader(self->output_channel, false);
+       }
+       return 0;
+}
+
+static PyObject*
+OutputChannel_get_prefader(OutputChannelObject *self, void *closure)
+{
+       PyObject *result;
+
+       if (output_channel_is_prefader(self->output_channel)) {
+               result = Py_True;
+       } else {
+               result = Py_False;
+       }
+       Py_INCREF(result);
+       return result;
+}
+
+static PyGetSetDef OutputChannel_getseters[] = {
+       {"prefader", 
+               (getter)OutputChannel_get_prefader, (setter)OutputChannel_set_prefader,
+               "prefader", NULL},
+       {NULL}
+};
+
 static PyObject*
 OutputChannel_remove(OutputChannelObject *self, PyObject *args)
 {
@@ -682,7 +714,7 @@ static PyTypeObject OutputChannelType = {
        0,                         /* tp_iternext */
        output_channel_methods,    /* tp_methods */
        0,             /* tp_members */
-       0,           /* tp_getset */
+       OutputChannel_getseters,   /* tp_getset */
        &ChannelType,              /* tp_base */
        0,                         /* tp_dict */
        0,                         /* tp_descr_get */