From 9171df460f26c9041a895c831379e994ad18e628 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 2 Sep 2015 12:20:39 +0100 Subject: [PATCH 1/6] Innitial removal of inOverflow state and deletion of oldest packet from buffer. Includes lots of debug. --- module_usb_audio/usb_buffer/decouple.xc | 227 ++++++++++++++++++++---- 1 file changed, 197 insertions(+), 30 deletions(-) diff --git a/module_usb_audio/usb_buffer/decouple.xc b/module_usb_audio/usb_buffer/decouple.xc index 89a8844e..99139d3a 100644 --- a/module_usb_audio/usb_buffer/decouple.xc +++ b/module_usb_audio/usb_buffer/decouple.xc @@ -37,6 +37,8 @@ unsigned int multIn[NUM_USB_CHAN_IN + 1]; static xc_ptr p_multIn; #endif +unsigned pktCounter = 0; + /* Number of channels to/from the USB bus - initialised to HS Audio 2.0 */ unsigned g_numUsbChan_Out = NUM_USB_CHAN_OUT; unsigned g_numUsbChan_In = NUM_USB_CHAN_IN; @@ -91,8 +93,8 @@ xc_ptr g_aud_to_host_wrptr; xc_ptr g_aud_to_host_dptr; xc_ptr g_aud_to_host_rdptr; xc_ptr g_aud_to_host_zeros; -int sampsToWrite = 0; -int totalSampsToWrite = 0; +int sampsToWrite = 24; // TODO +int totalSampsToWrite = 24; // TODO int aud_data_remaining_to_device = 0; /* Audio over/under flow flags */ @@ -134,7 +136,8 @@ void handle_audio_request(chanend c_mix_out) outuint(c_mix_out, 0); /* If in overflow condition then receive samples and throw away */ - if(inOverflow || sampsToWrite == 0) + //if(inOverflow || sampsToWrite == 0) + if(0) { #pragma loop unroll for(int i = 0; i < NUM_USB_CHAN_IN; i++) @@ -196,10 +199,12 @@ __builtin_unreachable(); #endif unsigned ptr = g_aud_to_host_dptr; + pktCounter++; for(int i = 0; i < g_numUsbChan_In; i++) { /* Receive sample */ int sample = inuint(c_mix_out); + sample = pktCounter; #if(INPUT_VOLUME_CONTROL == 1) #if !defined(IN_VOLUME_IN_MIXER) /* Apply volume */ @@ -223,6 +228,28 @@ __builtin_unreachable(); /* Update global pointer */ g_aud_to_host_dptr = ptr; + + // if(g_aud_to_host_dptr > aud_to_host_fifo_end) + if(0) + { + printstr("END BUFF\n"); + printstr("START: "); + printintln(aud_to_host_fifo_start); + printstr("DPTR: "); + printintln(g_aud_to_host_dptr); + + printstr("WRPTR : "); + printintln(g_aud_to_host_wrptr); + printstr("END: "); + printintln(aud_to_host_fifo_end); + + printstr("totalSampsToWrite: "); + printintln(totalSampsToWrite); + + printintln((g_aud_to_host_dptr - g_aud_to_host_wrptr)/4); + printintln(g_aud_to_host_dptr - aud_to_host_fifo_end); + while(1); + } break; } @@ -445,13 +472,30 @@ __builtin_unreachable(); if (!inOverflow) { - if (sampsToWrite == 0) + if(sampsToWrite < 0) + { + printstr("sampsToWrite < 0"); + while(1); + } + else if (sampsToWrite == 0) { int speed; - if (totalSampsToWrite) + /* Write last packet length into FIFO */ + unsigned datasize = totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In; + write_via_xc_ptr(g_aud_to_host_wrptr, datasize); + + if((datasize > 1000) || (datasize <= 0)) { - unsigned datasize = totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In; + printstr("BAD DATASIZE\n"); + printintln(datasize); + while(1); + } + + // Move wr ptr on by old packet length + // if (totalSampsToWrite) + { + //printintln(totalSampsToWrite); /* Round up to nearest word - note, not needed for slotsize == 4! */ datasize = (datasize+3) & (~0x3); @@ -462,8 +506,11 @@ __builtin_unreachable(); { g_aud_to_host_wrptr = aud_to_host_fifo_start; } + //printstr("Wr ptr: "); + //printhexln(g_aud_to_host_wrptr); } + /* Now calculate new packet length... */ /* Get feedback val - ideally this would be syncronised */ asm volatile("ldw %0, dp[g_speed]" : "=r" (speed) :); @@ -472,33 +519,47 @@ __builtin_unreachable(); totalSampsToWrite = speedRem >> 16; speedRem &= 0xffff; + if(totalSampsToWrite <= 0) + { + printstrln("poo"); + printintln(speedRem); + while(1); + } + #if 0 - if (usb_speed == XUD_SPEED_HS) + unsigned newdatasize = totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In; + /* Wrap wr ptr if next packet wont fit */ + newdatasize = (newdatasize+3) & (~0x3); + + if ((g_aud_to_host_wrptr+4+newdatasize) >= aud_to_host_fifo_end) { - if (totalSampsToWrite < 0 || totalSampsToWrite*4*g_numUsbChan_In > (MAX_DEVICE_AUD_PACKET_SIZE_CLASS_TWO)) - { - totalSampsToWrite = 0; - } - } - else - { - if (totalSampsToWrite < 0 || totalSampsToWrite*3*NUM_USB_CHAN_IN_FS > (MAX_DEVICE_AUD_PACKET_SIZE_CLASS_ONE)) - { - totalSampsToWrite = 0; - } - } -#else + g_aud_to_host_wrptr = aud_to_host_fifo_start; + printstr("wrapped next wr ptr on pkt: "); + printintln(pktCounter); + } +#endif + g_aud_to_host_dptr = g_aud_to_host_wrptr + 4; + + //printstr("DPTR: " ); + //printintln(g_aud_to_host_dptr); + + //printstr("WRPTR : "); + //printintln(g_aud_to_host_wrptr); + + if (totalSampsToWrite < 0 || totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In > g_maxPacketSize) { totalSampsToWrite = 0; + + printstrln("poo"); + while(1); } -#endif /* Calc slots left in fifo */ space_left = g_aud_to_host_rdptr - g_aud_to_host_wrptr; /* Mod and special case */ - if (space_left <= 0 && g_aud_to_host_rdptr == aud_to_host_fifo_start) + if ((space_left <= 0) && (g_aud_to_host_rdptr == aud_to_host_fifo_start)) { space_left = aud_to_host_fifo_end - g_aud_to_host_wrptr; } @@ -508,16 +569,116 @@ __builtin_unreachable(); /* Packet okay, write to fifo */ if (totalSampsToWrite) { - write_via_xc_ptr(g_aud_to_host_wrptr, totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In); + /* Write length into FIFO */ + //int x = totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In; + //write_via_xc_ptr(g_aud_to_host_wrptr, x); + + //if(x == 0) + //{ + // printstr("wank\n"); + // printintln(g_curSubSlot_In); + // printintln(g_numUsbChan_In); + // while(1); + // } packState = 0; - g_aud_to_host_dptr = g_aud_to_host_wrptr + 4; + //g_aud_to_host_dptr = g_aud_to_host_wrptr + 4; + + // if(g_aud_to_host_dptr >= aud_to_host_fifo_end-24) + { + //printstr("A"); + // while(1); + } } } else { - inOverflow = 1; - totalSampsToWrite = 0; + /* IN pipe has filled its buffer - we need to overflow + * Accept the packet, and throw away the oldest in the buffer */ + + /* Packet okay, write to fifo */ + if (totalSampsToWrite) + { + //int x = totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In; + //write_via_xc_ptr(g_aud_to_host_wrptr, x); + + //if((x == 0)) + // { printstr("writing 0 length"); + // while(1); + // } + + //if(g_aud_to_host_dptr >= aud_to_host_fifo_end-24) + { + //printstr("B"); + // while(1); + } + + packState = 0; + //g_aud_to_host_dptr = g_aud_to_host_wrptr + 4; + + /* Remove oldest packet */ + /* Read Datasize */ + unsigned datalength; + unsigned newdatalength; + unsigned p; + GET_SHARED_GLOBAL(p, g_aud_to_host_rdptr); + asm volatile("ldw %0, %1[0]":"=r"(datalength):"r"(p)); +#if 0 + printstr("'\nOVERFLOW. RdPtr: "); + printintln(g_aud_to_host_rdptr); + printstr("DATALENGTH : "); + printintln(datalength); + + printstr("START: "); + printintln(aud_to_host_fifo_start); + printstr("DPTR: "); + printintln(g_aud_to_host_dptr); + + printstr("WRPTR : "); + printintln(g_aud_to_host_wrptr); + printstr("END: "); + printintln(aud_to_host_fifo_end); +#endif +#if 1 + /* Move read pointer on by length*/ + /* TODO Remeber to wrap! */ + /* TODO might need to throw away multiple packets */ + + p = p + ((datalength+3)&~0x3) + 4; + if (p >= aud_to_host_fifo_end) + { + p = aud_to_host_fifo_start; + //printstr("FUCK UP"); + //while(1); + } + asm volatile("ldw %0, %1[0]":"=r"(newdatalength):"r"(p)); + + //printstr("New datalength: "); + //printintln(newdatalength); + + if(newdatalength == 0) + { + printstr("DATALENGTH: "); + printintln(datalength); + printstr("shit"); + printintln(aud_to_host_fifo_start); + printintln(p); + printintln(aud_to_host_fifo_end); + while(1); + } + SET_SHARED_GLOBAL(g_aud_to_host_rdptr, p); +#endif + } + //inOverflow = 1; + //totalSampsToWrite = 0; } + + if(totalSampsToWrite == 0) + { + printstr("ZERO SAMPLES TO WRITE\n"); + while(1); + } + + sampsToWrite = totalSampsToWrite; } } @@ -628,6 +789,7 @@ void decouple(chanend c_mix_out aud_to_host_fifo_end = aud_to_host_fifo_start + BUFF_SIZE_IN*4; g_aud_to_host_wrptr = aud_to_host_fifo_start; g_aud_to_host_rdptr = aud_to_host_fifo_start; + g_aud_to_host_dptr = aud_to_host_fifo_start + 4; /* Setup pointer to In stream 0 buffer. Note, length will be innited to 0 * However, this should be over-written on first stream start (assuming host @@ -704,9 +866,12 @@ void decouple(chanend c_mix_out GET_SHARED_GLOBAL(tmp, g_freqChange_flag); if (tmp == SET_SAMPLE_FREQ) { + printstr("FREQ CHANGE *******************"); + printintln(pktCounter); SET_SHARED_GLOBAL(g_freqChange_flag, 0); GET_SHARED_GLOBAL(sampFreq, g_freqChange_sampFreq); + /* Pass on to mixer */ DISABLE_INTERRUPTS(); inuint(c_mix_out); @@ -717,8 +882,9 @@ void decouple(chanend c_mix_out inUnderflow = 1; SET_SHARED_GLOBAL(g_aud_to_host_rdptr, aud_to_host_fifo_start); SET_SHARED_GLOBAL(g_aud_to_host_wrptr, aud_to_host_fifo_start); - SET_SHARED_GLOBAL(sampsToWrite, 0); - SET_SHARED_GLOBAL(totalSampsToWrite, 0); + SET_SHARED_GLOBAL(g_aud_to_host_dptr,aud_to_host_fifo_start+4); + SET_SHARED_GLOBAL(sampsToWrite, 24); + SET_SHARED_GLOBAL(totalSampsToWrite, 24); // TODO /* Set buffer to send back to zeros buffer */ SET_SHARED_GLOBAL(g_aud_to_host_buffer, g_aud_to_host_zeros); @@ -767,8 +933,9 @@ void decouple(chanend c_mix_out inUnderflow = 1; SET_SHARED_GLOBAL(g_aud_to_host_rdptr, aud_to_host_fifo_start); SET_SHARED_GLOBAL(g_aud_to_host_wrptr,aud_to_host_fifo_start); - SET_SHARED_GLOBAL(sampsToWrite, 0); - SET_SHARED_GLOBAL(totalSampsToWrite, 0); + SET_SHARED_GLOBAL(g_aud_to_host_dptr,aud_to_host_fifo_start+4); + SET_SHARED_GLOBAL(sampsToWrite, 24); //TODO + SET_SHARED_GLOBAL(totalSampsToWrite, 24);//TODO /* Set buffer back to zeros buffer */ SET_SHARED_GLOBAL(g_aud_to_host_buffer, g_aud_to_host_zeros); From e5cbfe147c25c431510acafcdeba462e35e696d6 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 2 Sep 2015 12:31:26 +0100 Subject: [PATCH 2/6] Started removing debug code. --- module_usb_audio/usb_buffer/decouple.xc | 74 ++----------------------- 1 file changed, 4 insertions(+), 70 deletions(-) diff --git a/module_usb_audio/usb_buffer/decouple.xc b/module_usb_audio/usb_buffer/decouple.xc index 99139d3a..99130789 100644 --- a/module_usb_audio/usb_buffer/decouple.xc +++ b/module_usb_audio/usb_buffer/decouple.xc @@ -472,12 +472,7 @@ __builtin_unreachable(); if (!inOverflow) { - if(sampsToWrite < 0) - { - printstr("sampsToWrite < 0"); - while(1); - } - else if (sampsToWrite == 0) + if (sampsToWrite == 0) { int speed; @@ -485,18 +480,9 @@ __builtin_unreachable(); unsigned datasize = totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In; write_via_xc_ptr(g_aud_to_host_wrptr, datasize); - if((datasize > 1000) || (datasize <= 0)) - { - printstr("BAD DATASIZE\n"); - printintln(datasize); - while(1); - } - // Move wr ptr on by old packet length // if (totalSampsToWrite) { - //printintln(totalSampsToWrite); - /* Round up to nearest word - note, not needed for slotsize == 4! */ datasize = (datasize+3) & (~0x3); @@ -506,10 +492,10 @@ __builtin_unreachable(); { g_aud_to_host_wrptr = aud_to_host_fifo_start; } - //printstr("Wr ptr: "); - //printhexln(g_aud_to_host_wrptr); } + g_aud_to_host_dptr = g_aud_to_host_wrptr + 4; + /* Now calculate new packet length... */ /* Get feedback val - ideally this would be syncronised */ asm volatile("ldw %0, dp[g_speed]" : "=r" (speed) :); @@ -519,37 +505,9 @@ __builtin_unreachable(); totalSampsToWrite = speedRem >> 16; speedRem &= 0xffff; - if(totalSampsToWrite <= 0) - { - printstrln("poo"); - printintln(speedRem); - while(1); - } - -#if 0 - unsigned newdatasize = totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In; - /* Wrap wr ptr if next packet wont fit */ - newdatasize = (newdatasize+3) & (~0x3); - - if ((g_aud_to_host_wrptr+4+newdatasize) >= aud_to_host_fifo_end) - { - g_aud_to_host_wrptr = aud_to_host_fifo_start; - printstr("wrapped next wr ptr on pkt: "); - printintln(pktCounter); - } -#endif - g_aud_to_host_dptr = g_aud_to_host_wrptr + 4; - - //printstr("DPTR: " ); - //printintln(g_aud_to_host_dptr); - - //printstr("WRPTR : "); - //printintln(g_aud_to_host_wrptr); - - if (totalSampsToWrite < 0 || totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In > g_maxPacketSize) { - totalSampsToWrite = 0; + totalSampsToWrite = 0; printstrln("poo"); while(1); @@ -647,38 +605,14 @@ __builtin_unreachable(); if (p >= aud_to_host_fifo_end) { p = aud_to_host_fifo_start; - //printstr("FUCK UP"); - //while(1); } asm volatile("ldw %0, %1[0]":"=r"(newdatalength):"r"(p)); - - //printstr("New datalength: "); - //printintln(newdatalength); - if(newdatalength == 0) - { - printstr("DATALENGTH: "); - printintln(datalength); - printstr("shit"); - printintln(aud_to_host_fifo_start); - printintln(p); - printintln(aud_to_host_fifo_end); - while(1); - } SET_SHARED_GLOBAL(g_aud_to_host_rdptr, p); #endif } - //inOverflow = 1; - //totalSampsToWrite = 0; } - if(totalSampsToWrite == 0) - { - printstr("ZERO SAMPLES TO WRITE\n"); - while(1); - } - - sampsToWrite = totalSampsToWrite; } } From facfcd82ec5b74fa48fd4cd5bf24c016bb8161af Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 2 Sep 2015 12:37:33 +0100 Subject: [PATCH 3/6] Removed pktcount debug. --- module_usb_audio/usb_buffer/decouple.xc | 27 ------------------------- 1 file changed, 27 deletions(-) diff --git a/module_usb_audio/usb_buffer/decouple.xc b/module_usb_audio/usb_buffer/decouple.xc index 99130789..2f79a831 100644 --- a/module_usb_audio/usb_buffer/decouple.xc +++ b/module_usb_audio/usb_buffer/decouple.xc @@ -37,8 +37,6 @@ unsigned int multIn[NUM_USB_CHAN_IN + 1]; static xc_ptr p_multIn; #endif -unsigned pktCounter = 0; - /* Number of channels to/from the USB bus - initialised to HS Audio 2.0 */ unsigned g_numUsbChan_Out = NUM_USB_CHAN_OUT; unsigned g_numUsbChan_In = NUM_USB_CHAN_IN; @@ -199,12 +197,10 @@ __builtin_unreachable(); #endif unsigned ptr = g_aud_to_host_dptr; - pktCounter++; for(int i = 0; i < g_numUsbChan_In; i++) { /* Receive sample */ int sample = inuint(c_mix_out); - sample = pktCounter; #if(INPUT_VOLUME_CONTROL == 1) #if !defined(IN_VOLUME_IN_MIXER) /* Apply volume */ @@ -229,27 +225,6 @@ __builtin_unreachable(); /* Update global pointer */ g_aud_to_host_dptr = ptr; - // if(g_aud_to_host_dptr > aud_to_host_fifo_end) - if(0) - { - printstr("END BUFF\n"); - printstr("START: "); - printintln(aud_to_host_fifo_start); - printstr("DPTR: "); - printintln(g_aud_to_host_dptr); - - printstr("WRPTR : "); - printintln(g_aud_to_host_wrptr); - printstr("END: "); - printintln(aud_to_host_fifo_end); - - printstr("totalSampsToWrite: "); - printintln(totalSampsToWrite); - - printintln((g_aud_to_host_dptr - g_aud_to_host_wrptr)/4); - printintln(g_aud_to_host_dptr - aud_to_host_fifo_end); - while(1); - } break; } @@ -800,8 +775,6 @@ void decouple(chanend c_mix_out GET_SHARED_GLOBAL(tmp, g_freqChange_flag); if (tmp == SET_SAMPLE_FREQ) { - printstr("FREQ CHANGE *******************"); - printintln(pktCounter); SET_SHARED_GLOBAL(g_freqChange_flag, 0); GET_SHARED_GLOBAL(sampFreq, g_freqChange_sampFreq); From 9210b11823fa1b1cffa7162f7e37ae98d339d6ee Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Wed, 2 Sep 2015 15:59:37 +0100 Subject: [PATCH 4/6] More tidy. Multiple IN packets now ditched on over flow (gets buffer to nice pre-fill level). inOverflow flag removed completely. --- module_usb_audio/usb_buffer/decouple.xc | 167 ++++++------------------ 1 file changed, 39 insertions(+), 128 deletions(-) diff --git a/module_usb_audio/usb_buffer/decouple.xc b/module_usb_audio/usb_buffer/decouple.xc index 2f79a831..1efa0c23 100644 --- a/module_usb_audio/usb_buffer/decouple.xc +++ b/module_usb_audio/usb_buffer/decouple.xc @@ -99,7 +99,6 @@ int aud_data_remaining_to_device = 0; unsigned outUnderflow = 1; unsigned outOverflow = 0; unsigned inUnderflow = 1; -unsigned inOverflow = 0; int aud_req_in_count = 0; int aud_req_out_count = 0; @@ -134,30 +133,6 @@ void handle_audio_request(chanend c_mix_out) outuint(c_mix_out, 0); /* If in overflow condition then receive samples and throw away */ - //if(inOverflow || sampsToWrite == 0) - if(0) - { -#pragma loop unroll - for(int i = 0; i < NUM_USB_CHAN_IN; i++) - { - (void) inuint(c_mix_out); - } - - /* Calculate how much space left in buffer */ - space_left = g_aud_to_host_rdptr - g_aud_to_host_wrptr; - - if (space_left <= 0) - { - space_left += BUFF_SIZE_IN*4; - } - - /* Check if we can come out of overflow */ - if (space_left > (BUFF_SIZE_IN*4/2)) - { - inOverflow = 0; - } - } - else { /* Not in overflow, store samples from mixer into sample buffer */ switch(g_curSubSlot_In) @@ -435,7 +410,6 @@ __builtin_unreachable(); } /* switch(g_curSubSlot_Out) */ - /* Output remaining channels. Past this point we always operate on MAX chan count */ for(int i = 0; i < NUM_USB_CHAN_OUT - g_numUsbChan_Out; i++) { outuint(c_mix_out, 0); @@ -445,28 +419,27 @@ __builtin_unreachable(); aud_data_remaining_to_device -= (g_numUsbChan_Out * g_curSubSlot_Out); } - if (!inOverflow) { + /* Finished creating packet - commit it to the FIFO */ if (sampsToWrite == 0) { int speed; + packState = 0; /* Write last packet length into FIFO */ unsigned datasize = totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In; write_via_xc_ptr(g_aud_to_host_wrptr, datasize); - // Move wr ptr on by old packet length - // if (totalSampsToWrite) + /* Round up to nearest word - note, not needed for slotsize == 4! */ + datasize = (datasize+3) & (~0x3); + + /* Move wr ptr on by old packet length */ + g_aud_to_host_wrptr += 4+datasize; + + /* Do wrap */ + if (g_aud_to_host_wrptr >= aud_to_host_fifo_end) { - /* Round up to nearest word - note, not needed for slotsize == 4! */ - datasize = (datasize+3) & (~0x3); - - g_aud_to_host_wrptr += 4+datasize; - - if (g_aud_to_host_wrptr >= aud_to_host_fifo_end) - { g_aud_to_host_wrptr = aud_to_host_fifo_start; - } } g_aud_to_host_dptr = g_aud_to_host_wrptr + 4; @@ -480,13 +453,12 @@ __builtin_unreachable(); totalSampsToWrite = speedRem >> 16; speedRem &= 0xffff; +# if 0 if (totalSampsToWrite < 0 || totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In > g_maxPacketSize) { totalSampsToWrite = 0; - - printstrln("poo"); - while(1); } +#endif /* Calc slots left in fifo */ space_left = g_aud_to_host_rdptr - g_aud_to_host_wrptr; @@ -497,95 +469,36 @@ __builtin_unreachable(); space_left = aud_to_host_fifo_end - g_aud_to_host_wrptr; } - if ((space_left <= 0) || (space_left > totalSampsToWrite*g_numUsbChan_In * g_curSubSlot_In + 4)) + if((space_left > 0) && (space_left < (totalSampsToWrite * g_numUsbChan_In * g_curSubSlot_In + 4))) { - /* Packet okay, write to fifo */ - if (totalSampsToWrite) - { - /* Write length into FIFO */ - //int x = totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In; - //write_via_xc_ptr(g_aud_to_host_wrptr, x); - - //if(x == 0) - //{ - // printstr("wank\n"); - // printintln(g_curSubSlot_In); - // printintln(g_numUsbChan_In); - // while(1); - // } - packState = 0; - //g_aud_to_host_dptr = g_aud_to_host_wrptr + 4; - - // if(g_aud_to_host_dptr >= aud_to_host_fifo_end-24) - { - //printstr("A"); - // while(1); - } - } - } - else - { - /* IN pipe has filled its buffer - we need to overflow + /* In pipe has filled its buffer - we need to overflow * Accept the packet, and throw away the oldest in the buffer */ - - /* Packet okay, write to fifo */ - if (totalSampsToWrite) - { - //int x = totalSampsToWrite * g_curSubSlot_In * g_numUsbChan_In; - //write_via_xc_ptr(g_aud_to_host_wrptr, x); - - //if((x == 0)) - // { printstr("writing 0 length"); - // while(1); - // } - - //if(g_aud_to_host_dptr >= aud_to_host_fifo_end-24) - { - //printstr("B"); - // while(1); - } - - packState = 0; - //g_aud_to_host_dptr = g_aud_to_host_wrptr + 4; - - /* Remove oldest packet */ - /* Read Datasize */ - unsigned datalength; - unsigned newdatalength; - unsigned p; - GET_SHARED_GLOBAL(p, g_aud_to_host_rdptr); - asm volatile("ldw %0, %1[0]":"=r"(datalength):"r"(p)); -#if 0 - printstr("'\nOVERFLOW. RdPtr: "); - printintln(g_aud_to_host_rdptr); - printstr("DATALENGTH : "); - printintln(datalength); - - printstr("START: "); - printintln(aud_to_host_fifo_start); - printstr("DPTR: "); - printintln(g_aud_to_host_dptr); - - printstr("WRPTR : "); - printintln(g_aud_to_host_wrptr); - printstr("END: "); - printintln(aud_to_host_fifo_end); -#endif -#if 1 - /* Move read pointer on by length*/ - /* TODO Remeber to wrap! */ - /* TODO might need to throw away multiple packets */ - p = p + ((datalength+3)&~0x3) + 4; - if (p >= aud_to_host_fifo_end) - { - p = aud_to_host_fifo_start; - } - asm volatile("ldw %0, %1[0]":"=r"(newdatalength):"r"(p)); - - SET_SHARED_GLOBAL(g_aud_to_host_rdptr, p); -#endif - } + /* Keep throwing away packets until buffer is at a nice level.. */ + do + { + unsigned rdPtr; + + /* Read length of packet in buffer at read pointer */ + unsigned datalength; + + GET_SHARED_GLOBAL(rdPtr, g_aud_to_host_rdptr); + asm volatile("ldw %0, %1[0]":"=r"(datalength):"r"(rdPtr)); + + /* Round up datalength */ + datalength = ((datalength+3) & ~0x3) + 4; + + /* Move read pointer on by length */ + rdPtr += datalength; + if (rdPtr >= aud_to_host_fifo_end) + { + rdPtr = aud_to_host_fifo_start; + } + + space_left += datalength; + SET_SHARED_GLOBAL(g_aud_to_host_rdptr, rdPtr); + + } while(space_left < (BUFF_SIZE_IN*4/2)); } sampsToWrite = totalSampsToWrite; @@ -785,7 +698,6 @@ void decouple(chanend c_mix_out outct(c_mix_out, SET_SAMPLE_FREQ); outuint(c_mix_out, sampFreq); - inOverflow = 0; inUnderflow = 1; SET_SHARED_GLOBAL(g_aud_to_host_rdptr, aud_to_host_fifo_start); SET_SHARED_GLOBAL(g_aud_to_host_wrptr, aud_to_host_fifo_start); @@ -836,7 +748,6 @@ void decouple(chanend c_mix_out GET_SHARED_GLOBAL(dataFormat, g_formatChange_DataFormat); /* Not currently used for input stream */ /* Reset IN buffer state */ - inOverflow = 0; inUnderflow = 1; SET_SHARED_GLOBAL(g_aud_to_host_rdptr, aud_to_host_fifo_start); SET_SHARED_GLOBAL(g_aud_to_host_wrptr,aud_to_host_fifo_start); From 59baec261fabc4faa66ecdbe2240ff3c6bfc2c6f Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 4 Sep 2015 11:33:41 +0100 Subject: [PATCH 5/6] Fixed up initial values for totalSampsToWrite/sampsToWrite --- module_usb_audio/usb_buffer/decouple.xc | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/module_usb_audio/usb_buffer/decouple.xc b/module_usb_audio/usb_buffer/decouple.xc index 1efa0c23..98833843 100644 --- a/module_usb_audio/usb_buffer/decouple.xc +++ b/module_usb_audio/usb_buffer/decouple.xc @@ -91,8 +91,8 @@ xc_ptr g_aud_to_host_wrptr; xc_ptr g_aud_to_host_dptr; xc_ptr g_aud_to_host_rdptr; xc_ptr g_aud_to_host_zeros; -int sampsToWrite = 24; // TODO -int totalSampsToWrite = 24; // TODO +int sampsToWrite = DEFAULT_FREQ/8000; /* HS assumed here. Expect to be junked during a overflow before stream start */ +int totalSampsToWrite = DEFAULT_FREQ/8000; int aud_data_remaining_to_device = 0; /* Audio over/under flow flags */ @@ -439,7 +439,7 @@ __builtin_unreachable(); /* Do wrap */ if (g_aud_to_host_wrptr >= aud_to_host_fifo_end) { - g_aud_to_host_wrptr = aud_to_host_fifo_start; + g_aud_to_host_wrptr = aud_to_host_fifo_start; } g_aud_to_host_dptr = g_aud_to_host_wrptr + 4; @@ -543,8 +543,7 @@ __builtin_unreachable(); /* Mark Endpoint (IN) ready with an appropriately sized zero buffer */ static inline void SetupZerosSendBuffer(XUD_ep aud_to_host_usb_ep, unsigned sampFreq, unsigned slotSize) { - int min, mid, max, usb_speed, p; - GET_SHARED_GLOBAL(usb_speed, g_curUsbSpeed); + int min, mid, max, p; GetADCCounts(sampFreq, min, mid, max); // TODO, don't need to use speed. @@ -556,6 +555,11 @@ static inline void SetupZerosSendBuffer(XUD_ep aud_to_host_usb_ep, unsigned samp //{ // mid *= NUM_USB_CHAN_IN_FS * slotSize; //} + + /* Set IN stream packet size to something sensible. We expect the buffer to + * over flow and this to be reset */ + SET_SHARED_GLOBAL(sampsToWrite, mid); + SET_SHARED_GLOBAL(totalSampsToWrite, mid); mid *= g_numUsbChan_In * slotSize; @@ -702,13 +706,11 @@ void decouple(chanend c_mix_out SET_SHARED_GLOBAL(g_aud_to_host_rdptr, aud_to_host_fifo_start); SET_SHARED_GLOBAL(g_aud_to_host_wrptr, aud_to_host_fifo_start); SET_SHARED_GLOBAL(g_aud_to_host_dptr,aud_to_host_fifo_start+4); - SET_SHARED_GLOBAL(sampsToWrite, 24); - SET_SHARED_GLOBAL(totalSampsToWrite, 24); // TODO /* Set buffer to send back to zeros buffer */ SET_SHARED_GLOBAL(g_aud_to_host_buffer, g_aud_to_host_zeros); - /* Update size of zeros buffer */ + /* Update size of zeros buffer (and sampsToWrite) */ SetupZerosSendBuffer(aud_to_host_usb_ep, sampFreq, g_curSubSlot_In); /* Reset OUT buffer state */ @@ -752,13 +754,11 @@ void decouple(chanend c_mix_out SET_SHARED_GLOBAL(g_aud_to_host_rdptr, aud_to_host_fifo_start); SET_SHARED_GLOBAL(g_aud_to_host_wrptr,aud_to_host_fifo_start); SET_SHARED_GLOBAL(g_aud_to_host_dptr,aud_to_host_fifo_start+4); - SET_SHARED_GLOBAL(sampsToWrite, 24); //TODO - SET_SHARED_GLOBAL(totalSampsToWrite, 24);//TODO /* Set buffer back to zeros buffer */ SET_SHARED_GLOBAL(g_aud_to_host_buffer, g_aud_to_host_zeros); - /* Update size of zeros buffer */ + /* Update size of zeros buffer (and sampsToWrite) */ SetupZerosSendBuffer(aud_to_host_usb_ep, sampFreq, g_curSubSlot_In); GET_SHARED_GLOBAL(usbSpeed, g_curUsbSpeed); From b30292d0144b6f53f97bdb3ee8948401c6d54d0c Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 4 Sep 2015 11:36:30 +0100 Subject: [PATCH 6/6] Comment. --- module_usb_audio/usb_buffer/usb_buffer.xc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module_usb_audio/usb_buffer/usb_buffer.xc b/module_usb_audio/usb_buffer/usb_buffer.xc index a42fe37f..2e6fdeb3 100644 --- a/module_usb_audio/usb_buffer/usb_buffer.xc +++ b/module_usb_audio/usb_buffer/usb_buffer.xc @@ -317,6 +317,8 @@ void buffer(register chanend c_aud_out, register chanend c_aud_in, sofCount = 0; clocks = 0; remnant = 0; + + /* Set g_speed to something sensible. We expect it to get over-written before stream time */ int min, mid, max; GetADCCounts(sampleFreq, min, mid, max); g_speed = mid<<16;