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

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.10.00.23 07-02-03 (ddk-b12)" */
  9. /* 
  10.  *  ======== tsk_audio.c ========
  11.  * 
  12.  *  This example demonstrates the use of IOM drivers with SIOs and tasks by 
  13.  *  using the DIO class driver with a user defined device mini-driver 
  14.  *  called "codec" and a class driver DIO instance called "dio_codec". This is 
  15.  *  the loopback application where audio is read from an input SIO, then sent 
  16.  *  back via an output SIO.
  17.  *  The following objects need to be created in the DSP/BIOS
  18.  *  configuration for this application:
  19.  *
  20.  *  * A UDEV object, which links in a user device driver. In this
  21.  *    case the UDEV is a codec based IOM device driver.
  22.  *  * A DIO object, which links the UDEV object.
  23.  *  * A TSK object, with the function to run set to the function echo
  24.  *    defined in this file.
  25.  *  * A LOG named trace for debug and status output.
  26.  */
  27. #include <std.h>
  28. #include <log.h>
  29. #include <sys.h>
  30. #include <mem.h>
  31. #include <sio.h>
  32. #ifdef _6x_
  33. extern far LOG_Obj trace;
  34. /* 
  35.  * Buffers placed in external memory are aligned on a 128 bytes boundary.
  36.  * In addition, the buffer should be of a size multiple of 128 bytes for 
  37.  * the cache work optimally on the C6x.
  38.  */
  39. #define BUFLEN 128      /* number of samples in the frame */
  40. #define BUFALIGN 128    /* alignment of buffer to allow use of L2 cache */
  41. #else
  42. extern LOG_Obj trace;
  43. #define BUFLEN 128      /* number of samples in the frame */
  44. #define BUFALIGN 1
  45. #endif
  46. #define BUFSIZE (BUFLEN * sizeof(MdUns)) 
  47. /* inStream and outStream are SIO handles created in main */
  48. SIO_Handle inStream, outStream;
  49. /* Function prototype */
  50. static Void createStreams();
  51. static Void prime();
  52. /*
  53.  * ======== main ========
  54.  */
  55. Void main()
  56. {
  57.     LOG_printf(&trace, "tsk_audio started");
  58. }
  59. /*
  60.  * ======== createStreams ========
  61.  */
  62. static Void createStreams()
  63. {
  64.     SIO_Attrs attrs;
  65.     
  66.     /* align the buffer to allow it to be used with L2 cache */
  67.     attrs = SIO_ATTRS;
  68.     attrs.align = BUFALIGN;
  69.     attrs.model = SIO_ISSUERECLAIM;
  70.     /* open the I/O streams */
  71.     inStream = SIO_create("/dioCodec", SIO_INPUT, BUFSIZE, &attrs);
  72.     if (inStream == NULL) {
  73.         SYS_abort("Create input stream FAILED.");
  74.     }
  75.     outStream = SIO_create("/dioCodec", SIO_OUTPUT, BUFSIZE, &attrs);
  76.     if (outStream == NULL) {
  77.         SYS_abort("Create output stream FAILED.");
  78.     }
  79. }
  80. /*
  81.  * ======== prime ========
  82.  */
  83. static Void prime()
  84. {
  85.     Ptr buf0, buf1, buf2, buf3;
  86.     LOG_printf(&trace, "Allocate buffers started");
  87.     /* Allocate buffers for the SIO buffer exchanges */
  88.     buf0 = (Ptr)MEM_calloc(0, BUFSIZE, BUFALIGN);
  89.     buf1 = (Ptr)MEM_calloc(0, BUFSIZE, BUFALIGN);
  90.     buf2 = (Ptr)MEM_calloc(0, BUFSIZE, BUFALIGN);
  91.     buf3 = (Ptr)MEM_calloc(0, BUFSIZE, BUFALIGN);
  92.     if (buf0 == NULL || buf1 == NULL || buf2 == NULL || buf3 == NULL) {
  93.         SYS_abort("MEM_calloc failed.");
  94.     } 
  95.     
  96.     /* Issue the first & second empty buffers to the input stream */
  97.     if (SIO_issue(inStream, buf0, SIO_bufsize(inStream), NULL) != SYS_OK) {
  98.         SYS_abort("Error issuing buffer to the input stream");
  99.     }
  100.     if (SIO_issue(inStream, buf1, SIO_bufsize(inStream), NULL) != SYS_OK) {
  101.         SYS_abort("Error issuing buffer to the input stream");
  102.     }
  103.     /* Issue the first & second empty buffers to the output stream */
  104.     if (SIO_issue(outStream, buf2, SIO_bufsize(outStream), NULL) != SYS_OK) {
  105.         SYS_abort("Error issuing buffer to the output stream");
  106.     }
  107.     if (SIO_issue(outStream, buf3, SIO_bufsize(outStream), NULL) != SYS_OK) {
  108.         SYS_abort("Error issuing buffer to the output stream");
  109.     }
  110. }
  111. /*
  112.  * ======== echo ========
  113.  * This function copies from the input SIO to the output SIO. You could
  114.  * easily replace the copy function with a signal processing algorithm. 
  115.  */
  116. Void echo()
  117. {
  118.     Int i;
  119.     Int nmadus;         /* number of minimal addressable units */
  120.     MdUns *inbuf, *outbuf;
  121.     /* Call createStream function to create I/O streams */
  122.     createStreams();
  123.     
  124.     /* Call prime function to do priming */
  125.     prime();
  126.     /* Loop forever looping back buffers */
  127.     for (;;) {
  128.         /* Reclaim full buffer from the input stream */
  129.         if ((nmadus = SIO_reclaim(inStream, (Ptr *)&inbuf, NULL)) < 0) {
  130.             SYS_abort("Error reclaiming full buffer from the input stream");
  131.         }
  132.         /* Reclaim empty buffer from the output stream to be reused */
  133.         if (SIO_reclaim(outStream, (Ptr *)&outbuf, NULL) < 0) {
  134.             SYS_abort("Error reclaiming empty buffer from the output stream");
  135.         }
  136.         /* Do the data move. */
  137.         for (i = 0; i < (nmadus / sizeof(short)); i++) {
  138.             outbuf[i] = inbuf[i];
  139.         }
  140.         /* Issue full buffer to the output stream */
  141.         if (SIO_issue(outStream, outbuf, nmadus, NULL) != SYS_OK) {
  142.             SYS_abort("Error issuing full buffer to the output stream");
  143.         }
  144.         /* Issue an empty buffer to the input stream */
  145.         if (SIO_issue(inStream, inbuf, SIO_bufsize(inStream), NULL) != SYS_OK) {
  146.             SYS_abort("Error issuing empty buffer to the input stream");
  147.         }
  148.     }
  149. }
  150. /*
  151.  *  ======== prd10secs ========
  152.  *  prd10secs is configured to be called every 10 seconds
  153.  */
  154. Void prd10secs()
  155. {
  156.     static Int seconds = 0;
  157.     static Int minutes = 0;
  158.     static Int hours = 0;
  159.     seconds += 10;
  160.     if (seconds == 60) {
  161.         seconds = 0;
  162.         minutes++;
  163.         if (minutes == 60) {
  164.             minutes = 0;
  165.             hours++;
  166.         }
  167.         LOG_printf(&trace, "%d hours and %d minutes", hours, minutes);
  168.     }
  169.     else {
  170.         LOG_printf(&trace, "%d seconds", seconds);
  171.     }
  172. }