pip_audio.c
上传用户:dahaojd
上传日期:2008-01-29
资源大小:14357k
文件大小:4k
源码类别:

DSP编程

开发平台:

C/C++

  1. /*
  2.  *  Copyright 2003 by Texas Instruments Incorporated.
  3.  *  All rights reserved. Property of Texas Instruments Incorporated.
  4.  *  Restricted rights to use, duplicate or disclose this code are
  5.  *  granted through contract.
  6.  *  
  7.  */
  8. /* "@(#) DDK 1.11.00.00 11-04-03 (ddk-b13)" */
  9. /*
  10.  *  ======== pip_audio.c ========
  11.  *
  12.  *  This example demonstrates the use of IOM drivers with PIPs using 
  13.  *  the PIO adapter with a user defined device mini-driver called
  14.  *  "udevCodec". The application performs a loopback.  That is, audio data is
  15.  *  read from one PIP connected to an input IOM channel, and the data is 
  16.  *  written back out on a PIP connected to an output IOM channel.
  17.  *
  18.  *  The following objects need to be created in the DSP/BIOS
  19.  *  configuration for this application:
  20.  *
  21.  *  * A UDEV object, which links in a user device driver. In this case
  22.  *    the UDEV is a codec based IOM device driver. 
  23.  *
  24.  *  * A SWI object named swiEcho. Configure the function as _echo,
  25.  *    and the mailbox value as 3.
  26.  *
  27.  *  * 2 PIP objects, one named pipTx, the other pipRx. The length of the
  28.  *    buffers should be the same and can be any size. See the comments
  29.  *    by the declarations below of pipTx and pipRx for the writer and
  30.  *    reader notify function settings.
  31.  *
  32.  *  * A LOG object named trace, used for status and debug output. Can be
  33.  *    any size and can be circular or fixed.
  34.  */
  35. #include <std.h>
  36. #include <log.h>
  37. #include <pip.h>
  38. #include <swi.h>
  39. #include <sys.h>
  40. #include <iom.h>
  41. #include <pio.h>
  42. #ifdef _6x_
  43. extern far LOG_Obj trace;
  44. extern far PIP_Obj pipRx; 
  45. extern far PIP_Obj pipTx;
  46. extern far SWI_Obj swiEcho;
  47. #else
  48. extern LOG_Obj trace; 
  49. extern PIP_Obj pipRx;
  50. extern PIP_Obj pipTx;
  51. extern SWI_Obj swiEcho;
  52. #endif
  53. /*
  54.  *  'pioRx' and 'pioTx' objects will be initialized by PIO_new(). 
  55.  */
  56. PIO_Obj pioRx, pioTx;
  57. /*
  58.  *  ======== main ========
  59.  *
  60.  *  Application startup funtion called by DSP/BIOS. Initialize the
  61.  *  PIO adapter then return back into DSP/BIOS.
  62.  */
  63. main()
  64. {
  65.     /*
  66.      * Initialize PIO module
  67.      */
  68.     PIO_init();
  69.     /* Bind the PIPs to the channels using the PIO class drivers */
  70.     PIO_new(&pioRx, &pipRx, "/udevCodec", IOM_INPUT, NULL);
  71.     PIO_new(&pioTx, &pipTx, "/udevCodec", IOM_OUTPUT, NULL);
  72.     /*
  73.      * Prime the transmit side with buffers of silence.
  74.      * The transmitter should be started before the receiver.
  75.      * This results in input-to-output latency being one full
  76.      * buffer period if the pipes is configured for 2 frames.
  77.      */
  78.     PIO_txStart(&pioTx, PIP_getWriterNumFrames(&pipTx), 0);
  79.     /* Prime the receive side with empty buffers to be filled. */
  80.     PIO_rxStart(&pioRx, PIP_getWriterNumFrames(&pipRx));
  81.     LOG_printf(&trace, "pip_audio started");   
  82. }
  83. /*
  84.  *  ======== echo ========
  85.  *
  86.  *  This function is called by the swiEcho DSP/BIOS SWI thread created
  87.  *  statically with the DSP/BIOS configuration tool. The PIO adapter
  88.  *  posts the swi when an the input PIP has a buffer of data and the
  89.  *  output PIP has an empty buffer to put new data into. This function
  90.  *  copies from the input PIP to the output PIP. You could easily
  91.  *  replace the copy function with a signal processing algorithm.
  92.  */
  93. Void echo(Void)
  94. {
  95.     Int i, size;
  96.     unsigned short *src, *dst;
  97.     /*
  98.      * Check that the precondions are met, that is pipRx has a buffer of
  99.      * data and pipTx has a free buffer.
  100.      */
  101.     if (PIP_getReaderNumFrames(&pipRx) <= 0) {
  102.         LOG_error("echo: No reader frame!", 0);
  103.         return;
  104.     }
  105.     if (PIP_getWriterNumFrames(&pipTx) <= 0) {
  106.         LOG_error("echo: No writer frame!", 0);
  107.         return;
  108.     }
  109.     /* get the full buffer from the receive PIP */
  110.     PIP_get(&pipRx);
  111.     src = PIP_getReaderAddr(&pipRx);
  112.     size = PIP_getReaderSize(&pipRx) * sizeof(short);
  113.     /* get the empty buffer from the transmit PIP */
  114.     PIP_alloc(&pipTx);
  115.     dst = PIP_getWriterAddr(&pipTx);
  116.      
  117.     /* Do the data move. */
  118.     for (i = 0; i < size; i++) {
  119.         *dst++ = *src++;
  120.     }     
  121.     /* Record the amount of actual data being sent */
  122.     PIP_setWriterSize(&pipTx, PIP_getReaderSize(&pipRx));
  123.     /* Free the receive buffer, put the transmit buffer */
  124.     PIP_put(&pipTx);
  125.     PIP_free(&pipRx);
  126. }