Mixer communications updated for new underflow protocol

This commit is contained in:
Ross Owen
2013-12-09 15:47:59 +00:00
parent 042d8f1969
commit 51e9415a57

View File

@@ -1,7 +1,6 @@
#include <xs1.h> #include <xs1.h>
#include <print.h>
#include "mixer.h" #include "mixer.h"
#include "devicedefines.h" #include "devicedefines.h"
#include "xc_ptr.h" #include "xc_ptr.h"
@@ -184,7 +183,9 @@ void giveSamplesToHost(chanend c, xc_ptr samples, xc_ptr ptr, xc_ptr multIn)
} }
#pragma unsafe arrays #pragma unsafe arrays
static void getSamplesFromHost(chanend c, xc_ptr samples, int base) static void getSamplesFromHost(chanend c, xc_ptr samples, int base, unsigned underflow)
{
if(!underflow)
{ {
#pragma loop unroll #pragma loop unroll
for (int i=0;i<NUM_USB_CHAN_OUT;i++) for (int i=0;i<NUM_USB_CHAN_OUT;i++)
@@ -216,11 +217,16 @@ static void getSamplesFromHost(chanend c, xc_ptr samples, int base)
#else #else
write_via_xc_ptr_indexed(samples,base+i,sample); write_via_xc_ptr_indexed(samples,base+i,sample);
#endif #endif
} } }
} }
#pragma unsafe arrays #pragma unsafe arrays
void giveSamplesToDevice(chanend c, xc_ptr samples, xc_ptr ptr, xc_ptr multOut) void giveSamplesToDevice(chanend c, xc_ptr samples, xc_ptr ptr, xc_ptr multOut, unsigned underflow)
{
outuint(c, underflow);
if(!underflow)
{ {
#pragma loop unroll #pragma loop unroll
for (int i=0;i<NUM_USB_CHAN_OUT;i++) for (int i=0;i<NUM_USB_CHAN_OUT;i++)
@@ -246,6 +252,7 @@ void giveSamplesToDevice(chanend c, xc_ptr samples, xc_ptr ptr, xc_ptr multOut)
#endif #endif
} }
} }
}
#pragma unsafe arrays #pragma unsafe arrays
void getSamplesFromDevice(chanend c, xc_ptr samples, int base) void getSamplesFromDevice(chanend c, xc_ptr samples, int base)
@@ -291,8 +298,8 @@ void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2)
while (1) while (1)
{ {
#pragma xta endpoint "mixer1_req" #pragma xta endpoint "mixer1_req"
/* Request from audio() */
inuint(c_mixer2); inuint(c_mixer2);
/* Request data from decouple thread */ /* Request data from decouple thread */
@@ -424,12 +431,10 @@ void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2)
#pragma loop unroll #pragma loop unroll
for (int i=0;i<MAX_MIX_COUNT;i++) for (int i=0;i<MAX_MIX_COUNT;i++)
{ {
write_via_xc_ptr_indexed(samples, write_via_xc_ptr_indexed(samples, (NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + i), 0);
(NUM_USB_CHAN_OUT + NUM_USB_CHAN_IN + i),
0);
} }
/* Inform mixer 2 about freq change */ /* Inform mixer2 (or audio())about freq change */
outct(c_mixer2, XS1_CT_END); outct(c_mixer2, XS1_CT_END);
outuint(c_mixer2, sampFreq); outuint(c_mixer2, sampFreq);
@@ -439,7 +444,7 @@ void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2)
} }
else else
{ {
inuint(c_host); unsigned underflow = inuint(c_host);
#if MAX_MIX_COUNT > 0 #if MAX_MIX_COUNT > 0
outuint(c_mixer2, 0); outuint(c_mixer2, 0);
giveSamplesToHost(c_host, samples, samples_to_host_map, multIn); giveSamplesToHost(c_host, samples, samples_to_host_map, multIn);
@@ -506,10 +511,10 @@ void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2)
} }
#else /* IF MAX_MIX_COUNT > 0 */ #else /* IF MAX_MIX_COUNT > 0 */
/* No mixes, this thread runs on its own doing just volume */ /* No mixes, this thread runs on its own doing just volume */
giveSamplesToDevice(c_mixer2, samples, samples_to_device_map, multOut); giveSamplesToDevice(c_mixer2, samples, samples_to_device_map, multOut, underflow);
getSamplesFromDevice(c_mixer2, samples, NUM_USB_CHAN_OUT); getSamplesFromDevice(c_mixer2, samples, NUM_USB_CHAN_OUT);
giveSamplesToHost(c_host, samples, samples_to_host_map, multIn); giveSamplesToHost(c_host, samples, samples_to_host_map, multIn);
getSamplesFromHost(c_host, samples, 0); getSamplesFromHost(c_host, samples, 0, underflow);
#endif #endif
} }
} }
@@ -517,6 +522,7 @@ void mixer1(chanend c_host, chanend c_mix_ctl, chanend c_mixer2)
int mixer2_mix2_flag = (DEFAULT_FREQ > 96000); int mixer2_mix2_flag = (DEFAULT_FREQ > 96000);
#if (MAX_MIX_COUNT > 0)
#pragma unsafe arrays #pragma unsafe arrays
void mixer2(chanend c_mixer1, chanend c_audio) void mixer2(chanend c_mixer1, chanend c_audio)
{ {
@@ -622,6 +628,7 @@ void mixer2(chanend c_mixer1, chanend c_audio)
} }
} }
} }
#endif
void mixer(chanend c_mix_in, chanend c_mix_out, chanend c_mix_ctl) void mixer(chanend c_mix_in, chanend c_mix_out, chanend c_mix_ctl)
{ {