echo sound see http://mbed.org/users/okini3939/notebook/I2S_TLV320AIC23B/

Dependencies:   I2SSlave TLV320 mbed

main.cpp

Committer:
okini3939
Date:
2012-11-23
Revision:
0:68f7b69ecca0

File content as of revision 0:68f7b69ecca0:

#include "mbed.h"
#include "TLV320.h"

#define BUF_SIZE 4000

Serial pc(USBTX, USBRX);
TLV320 audio(p9, p10, 0x34, p5, p6, p7, p8, p16); // I2S Codec
DigitalOut myled(LED1);

volatile int count = 0;
int addr = 0;
int buffer[BUF_SIZE];

// interrupt TLV320 send/recv
void isr_audio () {
    int i, a;
    short l, r, ll, rr;
    int buf[4];

    // I2S input
    audio.read();
    for (i = 0; i < 4; i ++) {
        buf[i] = audio.rxBuffer[i];
    }

    for (i = 0; i < 4; i ++) {
        l = (buffer[addr + i] >> 16);
        r = (buffer[addr + i] & 0xffff);
        ll = (buf[i] >> 16);
        rr = (buf[i] & 0xffff);
        l = (ll * 0.66) + (l * 0.33);
        r = (rr * 0.66) + (r * 0.33);
        buffer[addr + i] = buf[i];
        buf[i] = (l << 16) | (r & 0xffff);
    }
    addr += 4;
    if (addr >= BUF_SIZE) addr = 0;

    audio.write(buf, 0, 4);

    count ++;
}

int main() {
    int time = 0;

    pc.baud(115200);
    memset(buffer, 0, sizeof(buffer));

    audio.power(0x02); // mic off
    audio.outputVolume(1, 1); // headphone off
    audio.inputVolume(1, 1);
    audio.frequency(44100);
    audio.attach(&isr_audio);
    audio.start(RECEIVE);
    printf("Audio ready\r\n");

    while (1) {
        printf("%d / %d\r\n", time, count);
        printf("L %04x / R %04x\r\n", (buffer[0] >> 16), (buffer[0] & 0xffff));
        time ++;

        myled = 1;
        wait(0.5);
        myled = 0;
        wait(0.5);

//        if (pc.readable()) break;
    }

    audio.stop();
    printf("exit\r\n");
}