I am so cool I did it all by myself lol (.)(.) Hello my name is guitar reverse me and it is karaoke time this version which bumps the size of the buffer up and maximizes the chunk size to use all of this buffer. I also added a wait_us(50); at the top of the for() loop to reduce the sampling to something less than 20kHz. thanks adam and everybody oh look is that Eve.

Dependencies:   mbed

main.cpp

Committer:
mbed2f
Date:
2011-05-30
Revision:
0:8eeac881ada0

File content as of revision 0:8eeac881ada0:

#include <mbed.h>
 
// Boolean types
#define TRUE 1
#define FALSE 0

/* ADC for the microphone/input, DAC for the speaker/output */
AnalogIn mic(p19);
AnalogOut speaker(p18);
 
// Allocate a buffer to be used for the audio recording
static const size_t   BufferSize = 15 * 1024;
static unsigned short Buffer[BufferSize];
 
 
int main(void)
{
    unsigned short        ReadSample = 0xFFFF;
    // Indices to track where the playback and recording should take place in the
    // audio buffer.  The recording can occur one sample behind the current playback
    // index since it is no longer required.
    int                  Index = 0;
    // Reverse the direction the buffer is walked between each iteration to save memory
    int                  Direction = 1;
    // Have audio to playback
    int                  Playback = FALSE;
    // The amount of data to be recorded before starting reverse playback
    // NOTE: Probably want this to be configured at runtime via a knob, etc.
    int                  ChunkSize = BufferSize;
    
    // Infinite loop of recording and reverse playback
    for (;;)
    {
        unsigned short PlaySample;
 
        // Slow down the sampling rate so that it doesn't exceed 20kHz
        wait_us(50);
        
        // Read out the sample from the buffer to be played back
        if (Playback)
        {
            PlaySample = Buffer[Index];
            speaker.write_u16(PlaySample);
        }
        
        // Obtain current audio sample from the A/D converter.
        ReadSample = mic.read_u16();    
        
        // Record the sample into the buffer right where a space was freed up from the PlaySample read above
        Buffer[Index] = ReadSample;
        
         // Increment the buffer pointer
        Index += Direction;
        
        // Check to see if the chunk has been filled
        if (Index < 0)
        {
            // Now have a chunk to be played back
            Playback = TRUE;
            // Reverse the direction of playback and recording
            Direction *= -1;
            Index = 0;
        }
        else if (Index >= ChunkSize)
        {
            // Now have a chunk to be played back
            Playback = TRUE;
            // Reverse the direction of playback and recording
            Direction *= -1;
            Index = ChunkSize - 1;
        }
    }
}