recmgr.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  **********************************************************************
  3.  *     recmgr.c -- Recording manager for emu10k1 driver
  4.  *     Copyright 1999, 2000 Creative Labs, Inc.
  5.  *
  6.  **********************************************************************
  7.  *
  8.  *     Date                 Author          Summary of changes
  9.  *     ----                 ------          ------------------
  10.  *     October 20, 1999     Bertrand Lee    base code release
  11.  *
  12.  **********************************************************************
  13.  *
  14.  *     This program is free software; you can redistribute it and/or
  15.  *     modify it under the terms of the GNU General Public License as
  16.  *     published by the Free Software Foundation; either version 2 of
  17.  *     the License, or (at your option) any later version.
  18.  *
  19.  *     This program is distributed in the hope that it will be useful,
  20.  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22.  *     GNU General Public License for more details.
  23.  *
  24.  *     You should have received a copy of the GNU General Public
  25.  *     License along with this program; if not, write to the Free
  26.  *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
  27.  *     USA.
  28.  *
  29.  **********************************************************************
  30.  */
  31. #include "8010.h"
  32. #include "recmgr.h"
  33. void emu10k1_start_record(struct emu10k1_card *card, struct wavein_buffer *buffer)
  34. {
  35. DPF(2, "emu10k1_start_record()n");
  36. sblive_writeptr(card, buffer->sizereg, 0, buffer->sizeregval);
  37. if (buffer->adcctl)
  38. sblive_writeptr(card, ADCCR, 0, buffer->adcctl);
  39. return;
  40. }
  41. void emu10k1_stop_record(struct emu10k1_card *card, struct wavein_buffer *buffer)
  42. {
  43. DPF(2, "emu10k1_stop_record()n");
  44. /* Disable record transfer */
  45. if (buffer->adcctl)
  46. sblive_writeptr(card, ADCCR, 0, 0);
  47. sblive_writeptr(card, buffer->sizereg, 0, ADCBS_BUFSIZE_NONE);
  48. return;
  49. }
  50. void emu10k1_set_record_src(struct emu10k1_card *card, struct wiinst *wiinst)
  51. {
  52. struct wavein_buffer *buffer = &wiinst->buffer;
  53. DPF(2, "emu10k1_set_record_src()n");
  54. switch (wiinst->recsrc) {
  55. case WAVERECORD_AC97:
  56. DPF(2, "recording source: AC97n");
  57. buffer->sizereg = ADCBS;
  58. buffer->addrreg = ADCBA;
  59. buffer->idxreg = ADCIDX_IDX;
  60. switch (wiinst->format.samplingrate) {
  61. case 0xBB80:
  62. buffer->adcctl = ADCCR_SAMPLERATE_48;
  63. break;
  64. case 0xAC44:
  65. buffer->adcctl = ADCCR_SAMPLERATE_44;
  66. break;
  67. case 0x7D00:
  68. buffer->adcctl = ADCCR_SAMPLERATE_32;
  69. break;
  70. case 0x5DC0:
  71. buffer->adcctl = ADCCR_SAMPLERATE_24;
  72. break;
  73. case 0x5622:
  74. buffer->adcctl = ADCCR_SAMPLERATE_22;
  75. break;
  76. case 0x3E80:
  77. buffer->adcctl = ADCCR_SAMPLERATE_16;
  78. break;
  79. case 0x2B11:
  80. buffer->adcctl = ADCCR_SAMPLERATE_11;
  81. break;
  82. case 0x1F40:
  83. buffer->adcctl = ADCCR_SAMPLERATE_8;
  84. break;
  85. default:
  86. BUG();
  87. break;
  88. }
  89. buffer->adcctl |= ADCCR_LCHANENABLE;
  90. if (wiinst->format.channels == 2)
  91. buffer->adcctl |= ADCCR_RCHANENABLE;
  92. break;
  93. case WAVERECORD_MIC:
  94. DPF(2, "recording source: MICn");
  95. buffer->sizereg = MICBS;
  96. buffer->addrreg = MICBA;
  97. buffer->idxreg = MICIDX_IDX;
  98. buffer->adcctl = 0;
  99. break;
  100. case WAVERECORD_FX:
  101. DPF(2, "recording source: FXn");
  102. buffer->sizereg = FXBS;
  103. buffer->addrreg = FXBA;
  104. buffer->idxreg = FXIDX_IDX;
  105. buffer->adcctl = 0;
  106. sblive_writeptr(card, FXWC, 0, wiinst->fxwc);
  107. break;
  108. default:
  109. BUG();
  110. break;
  111. }
  112. DPD(2, "bus addx: %#lxn", (unsigned long) buffer->dma_handle);
  113. sblive_writeptr(card, buffer->addrreg, 0, buffer->dma_handle);
  114. return;
  115. }