How to write a C Program Take microphone input and send to headphones in C Programming Language ?
Solution:
- /*****************************************************************************/
- /* DESCRIPTION */
- /* TMS320C5505 USB Stick. Application 1. Getting started. */
- /* Take microphone input and send to headphones. */
- /* */
- /* REVISION */
- /* Revision: 1.00 */
- /* Author : Richard Sikora */
- /*
- * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
- *
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the
- * distribution.
- *
- * Neither the name of Texas Instruments Incorporated nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
- #include "stdio.h"
- #include "usbstk5505.h"
- #include "aic3204.h"
- #include "PLL.h"
- #include "stereo.h"
- Int16 left_input;
- Int16 right_input;
- Int16 left_output;
- Int16 right_output;
- Int16 mono_input;
- #define SAMPLES_PER_SECOND 48000
- unsigned long int i = 0;
- /* ------------------------------------------------------------------------ *
- * *
- * main( ) *
- * *
- * ------------------------------------------------------------------------ */
- void main( void )
- {
- /* Initialize BSL */
- USBSTK5505_init( );
- // inicjalizacja zewnętrznego programatora, w której włączane są zegary dla peryferii, funkcja ta zwraca wartośc 0
- /* Initialize PLL */
- pll_frequency_setup(100);
- //ustawienie częstotliwości pętli synchronizacji fazowej, stosowanej do synchronizacji częstotliwości, na 100 MHz
- aic3204_hardware_init();
- aic3204_init();
- /* inicjalizacja interfejsu sprzętowego, kodeka audio - aic3204
- W funkcji tej między innymi zostaje ustawiony bit 5 - A20_MODE na stan 1, co oznacza ze wybrana została opcja wejścia/wyjścia GPIO26 (pin 26).
- Zainicjalizowana zostaje również magistrala I2C, w której ustawiono między innymi preskaler oraz częstotliwości zegara.*/
- printf("\n\nRunning Getting Started Project\n");
- printf( "<-> Audio Loopback from Stereo IN --> to HP/Lineout\n" );
- // Wyświetlenie tekstu na wyświetlaczu
- /* Setup sampling frequency and 30dB gain for microphone */
- set_sampling_frequency_and_gain(SAMPLES_PER_SECOND, 30);
- /*Funkcja w której przy zadanych parametrach następuje pomnożenie przez 2 argumentu ADCgain (30), co skutkuje zmianą kroków z 1 dB na 0.5 dB.
- Następnie zostaje zostaje sprawdzona poprawność wyboru częstotliwości. Jeżeli wybrana została częstotliwość inna niż : 6857, 800, 9600, 12000, 16000, 24000, 48000,
- domyślnie jej wartość zostaje ustawiona na 48000. */
- asm("bclr XF");
- // ustawienie XF (zewnętrznej flagi wyjścia) w stan niski, co podowuje wyłączenie znajdującej się na module diody
- for ( i = 0 ; i < SAMPLES_PER_SECOND * 600L ;i++ ) /* Proces próbkowania sygnału wejściowego. Argument 'i' jest typu long int, aby udało się przetworzyć 48000*600 próbek.*/
- {
- if("XF" == 0)
- {
- USBSTK5505_waitusec(500000); //Jeżeli zewnętrzna flaga wyjścia XF jest ustawiona na stan niski, to stan wysoki załączy się po 0.5s
- asm(" bset XF"); //Jeżeli natomiast na XF panuje stan wysoki, to stan niski zostanie włączony po 1s.
- }
- else
- {
- USBSTK5505_waitusec(1000000);
- asm(" bclr XF");
- }
- aic3204_codec_read(&left_input, &right_input); // funkcja, która zczytuje wartości sygnałów na wejściu co przerwanie
- mono_input = stereo_to_mono(left_input, right_input);
- // w funkcji tej sygnały wejściowe z obu kanałów zostają dodane, po czym ich wartość jest podzielona przez 2, aby zapobiec przesterowaniu
- left_output = left_input*2;
- // przypisanie sygnału z wejścia do wyjścia. W tym wypadku wzmocnienie lewego kanału w stosunku do wejścia bęzie dwukrotnie większe
- right_output = right_input;
- aic3204_codec_write(left_output, right_output); // funkcja, która wpisuje wartość sygnału w kodek AIC3204 zaraz przed wyjściem
- }
- /* Disable I2S and put codec into reset */
- aic3204_disable(); // reset kodeka i wyłączenie magistrali I2S
- printf( "\n***Program has Terminated***\n" );
- SW_BREAKPOINT; // pętla nieskończona while
- }
- /* ------------------------------------------------------------------------ *
- * *
- * End of main.c *
- * *
- * ------------------------------------------------------------------------ */