swi_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.  *  ======== swi_audio.c ========
  11.  * 
  12.  *  This example demonstrates the use of IOM drivers with SIOs and SWIs by
  13.  *  using the DIO class driver with a user defined device mini-driver 
  14.  *  called "codec". This is a loopback application where audio is read 
  15.  *  from an input SIO, then sent back via an output SIO. 
  16.  *
  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 object is a codec based IOM device driver.
  22.  *  * A DIO object, which links the UDEV object.
  23.  *  * A SWI 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 <dev.h>
  29. #include <log.h>
  30. #include <sys.h>
  31. #include <mem.h>
  32. #include <sio.h>
  33. #include <swi.h>
  34. #ifdef _6x_
  35. extern far LOG_Obj trace;
  36. extern far SWI_Obj swiEcho;
  37. /*
  38.  * Buffers placed in external memory ar aligned on a 128 bytes boundary. 
  39.  * In addition, the buffer should be of a size multiple of 128 bytes for the 
  40.  * cache work optimally on the C6x. 
  41.  */
  42. #define BUFLEN 128      /* number of samples in a frame */
  43. #define BUFALIGN 128    /* alignment of buffer to allow use of L2 cache */
  44. #else
  45. extern LOG_Obj trace;
  46. extern SWI_Obj swiEcho;
  47. #define BUFLEN 128      /* number of samples in a frame */
  48. #define BUFALIGN 1
  49. #endif
  50. #define BUFSIZE (BUFLEN * sizeof(MdUns))
  51. /* inStream and outStream are SIO handles created in main */
  52. SIO_Handle inStream, outStream;
  53. /* Function prototype */
  54. static Void createStreams();
  55. static Void prime();
  56. /*
  57.  *  ======== main ========
  58.  */
  59. Void main()
  60. {
  61.     /* Call createStreams function to create I/O streams */
  62.     createStreams();
  63.     /* Call prime function to do buffer priming */
  64.     prime();
  65.     LOG_printf(&trace, "swi_audio started");
  66. }
  67. /* 
  68.  * ======== createStreams ========
  69.  *
  70.  * This function creates the SIO streams to be used by the application 
  71.  */
  72. static Void createStreams()
  73. {
  74.     SIO_Attrs attrs;
  75.     DEV_Callback callback;    /* callback used because SWIs cannot block */
  76.     
  77.     callback.fxn = (Fxn)SWI_andnHook;
  78.     callback.arg0 = (Arg)&swiEcho;
  79.     callback.arg1 = (Arg)0x1; /* This sets the IOM_INPUT mode */
  80.     /* Align the buffer to allow it to be used with L2 cache */
  81.     attrs = SIO_ATTRS;
  82.     attrs.align = BUFALIGN;
  83.     attrs.model = SIO_ISSUERECLAIM;
  84.     attrs.callback = (DEV_Callback *)&callback;
  85.     /* Create the I/O streams */
  86.     inStream = SIO_create("/dioCodec", SIO_INPUT, BUFSIZE, &attrs);
  87.     if (inStream == NULL) {
  88.         SYS_abort("Create input stream  FAILED.");
  89.     }
  90.     callback.arg1 = (Arg)0x2; /* This sets the IOM_OUTPUT mode */
  91.     outStream = SIO_create("/dioCodec", SIO_OUTPUT, BUFSIZE, &attrs);
  92.     if (outStream == NULL) {
  93.         SYS_abort("Create output stream FAILED.");
  94.     }
  95. }
  96. /* 
  97.  * ======== prime ========
  98.  *
  99.  * This function primes the streams with empty buffers so that the 
  100.  * issue/reclaim loop can start in the application's processing thread.
  101.  */
  102. static Void prime()
  103. {
  104.     Ptr buf0, buf1, buf2, buf3;
  105.     LOG_printf(&trace, "Allocate buffers started");
  106.     /* Allocate buffers for the SIO buffer exchanges */
  107.     buf0 = (Ptr)MEM_calloc(0, BUFSIZE, BUFALIGN);
  108.     buf1 = (Ptr)MEM_calloc(0, BUFSIZE, BUFALIGN);
  109.     buf2 = (Ptr)MEM_calloc(0, BUFSIZE, BUFALIGN);
  110.     buf3 = (Ptr)MEM_calloc(0, BUFSIZE, BUFALIGN);
  111.     if (buf0 == NULL || buf1 == NULL || buf2 == NULL || buf3 == NULL) {
  112.         SYS_abort("MEM_calloc failed.");
  113.     } 
  114.     
  115.     /* Issue the first & second empty buffers to the input stream */
  116.     if (SIO_issue(inStream, buf0, SIO_bufsize(inStream), NULL) != SYS_OK) {
  117.         SYS_abort("Error issuing buffer");
  118.     }
  119.     if (SIO_issue(inStream, buf1, SIO_bufsize(inStream), NULL) != SYS_OK) {
  120.         SYS_abort("Error issuing buffer");
  121.     }
  122.     /* Issue the first & second empty buffers to the output stream */
  123.     if (SIO_issue(outStream, buf2, SIO_bufsize(outStream), NULL) != SYS_OK) {
  124.         SYS_abort("Error issuing buffer");
  125.     }
  126.     if (SIO_issue(outStream, buf3, SIO_bufsize(outStream), NULL) != SYS_OK) {
  127.         SYS_abort("Error issuing buffer");
  128.     }
  129. }
  130. /*
  131.  * ======== echo ========
  132.  * This function copies from the input SIO to the output SIO. You could 
  133.  * easily replace the copy function with a signal processing algorithm. 
  134.  */
  135. Void echo()
  136. {
  137.     unsigned short *inbuf, *outbuf;
  138.     Int nbytes, i;
  139.         
  140.     /* Reclaim full buffer from the input stream */
  141.     if ((nbytes = SIO_reclaim(inStream, (Ptr *)&inbuf, NULL)) < 0) {
  142.         SYS_abort("Error reclaiming full buffer from the input stream");
  143.     }
  144.     /* Reclaim empty buffer from the output stream to be reused */
  145.     if (SIO_reclaim(outStream, (Ptr *)&outbuf, NULL) < 0) {
  146.         SYS_abort("Error reclaiming empty buffer from the output stream");
  147.     }
  148.  
  149.     /* Do the data move. */
  150.     for (i = 0; i < (nbytes / sizeof(short)); i++) {
  151.         outbuf[i] = inbuf[i];
  152.     }     
  153.         
  154.     /* Issue full buffer to output stream */
  155.     if (SIO_issue(outStream, outbuf, nbytes, NULL) != SYS_OK) {
  156.         SYS_abort("Error issuing full buffer to output stream");
  157.     }           
  158.      
  159.     /* Issue empty buffer to input stream */
  160.     if (SIO_issue(inStream, inbuf, SIO_bufsize(inStream), NULL) != SYS_OK) {
  161.         SYS_abort("Error issuing empty buffer to input stream");
  162.     }
  163. }