recmgr.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

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 <asm/delay.h>
  32. #include "8010.h"
  33. #include "recmgr.h"
  34. void emu10k1_reset_record(struct emu10k1_card *card, struct wavein_buffer *buffer)
  35. {
  36. DPF(2, "emu10k1_reset_record()n");
  37. sblive_writeptr(card, buffer->sizereg, 0, ADCBS_BUFSIZE_NONE);
  38. sblive_writeptr(card, buffer->sizereg, 0, buffer->sizeregval);
  39. while (sblive_readptr(card, buffer->idxreg, 0))
  40. udelay(5);
  41. }
  42. void emu10k1_start_record(struct emu10k1_card *card, struct wavein_buffer *buffer)
  43. {
  44. DPF(2, "emu10k1_start_record()n");
  45. if (buffer->adcctl)
  46. sblive_writeptr(card, ADCCR, 0, buffer->adcctl);
  47. }
  48. void emu10k1_stop_record(struct emu10k1_card *card, struct wavein_buffer *buffer)
  49. {
  50. DPF(2, "emu10k1_stop_record()n");
  51. /* Disable record transfer */
  52. if (buffer->adcctl)
  53. sblive_writeptr(card, ADCCR, 0, 0);
  54. }
  55. void emu10k1_set_record_src(struct emu10k1_card *card, struct wiinst *wiinst)
  56. {
  57. struct wavein_buffer *buffer = &wiinst->buffer;
  58. DPF(2, "emu10k1_set_record_src()n");
  59. switch (wiinst->recsrc) {
  60. case WAVERECORD_AC97:
  61. DPF(2, "recording source: AC97n");
  62. buffer->sizereg = ADCBS;
  63. buffer->addrreg = ADCBA;
  64. buffer->idxreg = ADCIDX_IDX;
  65. switch (wiinst->format.samplingrate) {
  66. case 0xBB80:
  67. buffer->adcctl = ADCCR_SAMPLERATE_48;
  68. break;
  69. case 0xAC44:
  70. buffer->adcctl = ADCCR_SAMPLERATE_44;
  71. break;
  72. case 0x7D00:
  73. buffer->adcctl = ADCCR_SAMPLERATE_32;
  74. break;
  75. case 0x5DC0:
  76. buffer->adcctl = ADCCR_SAMPLERATE_24;
  77. break;
  78. case 0x5622:
  79. buffer->adcctl = ADCCR_SAMPLERATE_22;
  80. break;
  81. case 0x3E80:
  82. buffer->adcctl = ADCCR_SAMPLERATE_16;
  83. break;
  84. case 0x2B11:
  85. buffer->adcctl = ADCCR_SAMPLERATE_11;
  86. break;
  87. case 0x1F40:
  88. buffer->adcctl = ADCCR_SAMPLERATE_8;
  89. break;
  90. default:
  91. BUG();
  92. break;
  93. }
  94. buffer->adcctl |= ADCCR_LCHANENABLE;
  95. if (wiinst->format.channels == 2)
  96. buffer->adcctl |= ADCCR_RCHANENABLE;
  97. break;
  98. case WAVERECORD_MIC:
  99. DPF(2, "recording source: MICn");
  100. buffer->sizereg = MICBS;
  101. buffer->addrreg = MICBA;
  102. buffer->idxreg = MICIDX_IDX;
  103. buffer->adcctl = 0;
  104. break;
  105. case WAVERECORD_FX:
  106. DPF(2, "recording source: FXn");
  107. buffer->sizereg = FXBS;
  108. buffer->addrreg = FXBA;
  109. buffer->idxreg = FXIDX_IDX;
  110. buffer->adcctl = 0;
  111. sblive_writeptr(card, FXWC, 0, wiinst->fxwc);
  112. break;
  113. default:
  114. BUG();
  115. break;
  116. }
  117. DPD(2, "bus addx: %#lxn", (unsigned long) buffer->dma_handle);
  118. sblive_writeptr(card, buffer->addrreg, 0, (u32)buffer->dma_handle);
  119. }