📄 ixj.c
字号:
j->rec_frame_size = 80; break; case 0x50: j->rec_frame_size = 40; break; default: j->rec_frame_size = 120; break; } j->rec_mode = 4; break; case LINEAR16: switch (j->baseframe.low) { case 0xA0: j->rec_frame_size = 160; break; case 0x50: j->rec_frame_size = 80; break; default: j->rec_frame_size = 240; break; } j->rec_mode = 5; break; case LINEAR8: switch (j->baseframe.low) { case 0xA0: j->rec_frame_size = 80; break; case 0x50: j->rec_frame_size = 40; break; default: j->rec_frame_size = 120; break; } j->rec_mode = 6; break; case WSS: switch (j->baseframe.low) { case 0xA0: j->rec_frame_size = 80; break; case 0x50: j->rec_frame_size = 40; break; default: j->rec_frame_size = 120; break; } j->rec_mode = 7; break; default: j->rec_frame_size = 0; j->rec_mode = -1; if (j->read_buffer) { kfree(j->read_buffer); j->read_buffer = NULL; j->read_buffer_size = 0; } retval = 1; break; } return retval;}static int ixj_record_start(int board){ unsigned short cmd = 0x0000; IXJ *j = &ixj[board]; if (!j->rec_mode) { switch (j->rec_codec) { case G723_63: cmd = 0x5131; break; case G723_53: cmd = 0x5132; break; case TS85: cmd = 0x5130; // TrueSpeech 8.5 break; case TS48: cmd = 0x5133; // TrueSpeech 4.8 break; case TS41: cmd = 0x5134; // TrueSpeech 4.1 break; case G728: cmd = 0x5135; break; case G729: cmd = 0x5136; break; default: return 1; } if (ixj_WriteDSPCommand(cmd, board)) return -1; } if (!j->read_buffer) { if (!j->read_buffer) j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_KERNEL); if (!j->read_buffer) { printk("Read buffer allocation for ixj board %d failed!\n", board); return -ENOMEM; } } j->read_buffer_size = j->rec_frame_size * 2; if (ixj_WriteDSPCommand(0x5102, board)) // Set Poll sync mode return -1; switch (j->rec_mode) { case 0: cmd = 0x1C03; // Record C1 break; case 4: if (j->ver.low == 0x12) { cmd = 0x1E03; // Record C1 } else { cmd = 0x1E01; // Record C1 } break; case 5: if (j->ver.low == 0x12) { cmd = 0x1E83; // Record C1 } else { cmd = 0x1E81; // Record C1 } break; case 6: if (j->ver.low == 0x12) { cmd = 0x1F03; // Record C1 } else { cmd = 0x1F01; // Record C1 } break; case 7: if (j->ver.low == 0x12) { cmd = 0x1F83; // Record C1 } else { cmd = 0x1F81; // Record C1 } break; } if (ixj_WriteDSPCommand(cmd, board)) return -1; return 0;}static void ixj_record_stop(int board){ IXJ *j = &ixj[board]; if (j->rec_mode > -1) { ixj_WriteDSPCommand(0x5120, board); j->rec_mode = -1; }}static void set_rec_depth(int board, int depth){ if (depth > 60) depth = 60; if (depth < 0) depth = 0; ixj_WriteDSPCommand(0x5180 + depth, board);}static void set_rec_volume(int board, int volume){ ixj_WriteDSPCommand(0xCF03, board); ixj_WriteDSPCommand(volume, board);}static int get_rec_level(int board){ IXJ *j = &ixj[board]; ixj_WriteDSPCommand(0xCF88, board); return j->ssr.high << 8 | j->ssr.low;}static void ixj_aec_start(int board, int level){ IXJ *j = &ixj[board]; j->aec_level = level; if (!level) { ixj_WriteDSPCommand(0xB002, board); } else { if (j->rec_codec == G729 || j->play_codec == G729) { ixj_WriteDSPCommand(0xE022, board); // Move AEC filter buffer ixj_WriteDSPCommand(0x0300, board); } ixj_WriteDSPCommand(0xB001, board); // AEC On ixj_WriteDSPCommand(0xE013, board); // Advanced AEC C1 switch (level) { case 1: ixj_WriteDSPCommand(0x0000, board); // Advanced AEC C2 = off ixj_WriteDSPCommand(0xE011, board); ixj_WriteDSPCommand(0xFFFF, board); break; case 2: ixj_WriteDSPCommand(0x0600, board); // Advanced AEC C2 = on medium ixj_WriteDSPCommand(0xE011, board); ixj_WriteDSPCommand(0x0080, board); break; case 3: ixj_WriteDSPCommand(0x0C00, board); // Advanced AEC C2 = on high ixj_WriteDSPCommand(0xE011, board); ixj_WriteDSPCommand(0x0080, board); break; } }}static void aec_stop(int board){ IXJ *j = &ixj[board]; if (j->rec_codec == G729 || j->play_codec == G729) { ixj_WriteDSPCommand(0xE022, board); // Move AEC filter buffer back ixj_WriteDSPCommand(0x0700, board); } if (ixj[board].play_mode != -1 && ixj[board].rec_mode != -1); { ixj_WriteDSPCommand(0xB002, board); // AEC Stop }}static int set_play_codec(int board, int rate){ int retval = 0; IXJ *j = &ixj[board]; j->play_codec = rate; switch (rate) { case G723_63: if (j->ver.low != 0x12 || ixj_convert_loaded) { j->play_frame_size = 12; j->play_mode = 0; } else { retval = 1; } break; case G723_53: if (j->ver.low != 0x12 || ixj_convert_loaded) { j->play_frame_size = 10; j->play_mode = 0; } else { retval = 1; } break; case TS85: if (j->dsp.low == 0x20 || j->flags.ts85_loaded) { j->play_frame_size = 16; j->play_mode = 0; } else { retval = 1; } break; case TS48: if (j->ver.low != 0x12 || ixj_convert_loaded) { j->play_frame_size = 9; j->play_mode = 0; } else { retval = 1; } break; case TS41: if (j->ver.low != 0x12 || ixj_convert_loaded) { j->play_frame_size = 8; j->play_mode = 0; } else { retval = 1; } break; case G728: if (j->dsp.low != 0x20) { j->play_frame_size = 48; j->play_mode = 0; } else { retval = 1; } break; case G729: if (j->dsp.low != 0x20) { if (!j->flags.g729_loaded) { retval = 1; break; } switch (j->baseframe.low) { case 0xA0: j->play_frame_size = 10; break; case 0x50: j->play_frame_size = 5; break; default: j->play_frame_size = 15; break; } j->play_mode = 0; } else { retval = 1; } break; case ULAW: switch (j->baseframe.low) { case 0xA0: j->play_frame_size = 80; break; case 0x50: j->play_frame_size = 40; break; default: j->play_frame_size = 120; break; } j->play_mode = 2; break; case ALAW: switch (j->baseframe.low) { case 0xA0: j->play_frame_size = 80; break; case 0x50: j->play_frame_size = 40; break; default: j->play_frame_size = 120; break; } j->play_mode = 2; break; case LINEAR16: switch (j->baseframe.low) { case 0xA0: j->play_frame_size = 160; break; case 0x50: j->play_frame_size = 80; break; default: j->play_frame_size = 240; break; } j->play_mode = 6; break; case LINEAR8: switch (j->baseframe.low) { case 0xA0: j->play_frame_size = 80; break; case 0x50: j->play_frame_size = 40; break; default: j->play_frame_size = 120; break; } j->play_mode = 4; break; case WSS: switch (j->baseframe.low) { case 0xA0: j->play_frame_size = 80; break; case 0x50: j->play_frame_size = 40; break; default: j->play_frame_size = 120; break; } j->play_mode = 5; break; default: j->play_frame_size = 0; j->play_mode = -1; if (j->write_buffer) { kfree(j->write_buffer); j->write_buffer = NULL; j->write_buffer_size = 0; } retval = 1; break; } return retval;}static int ixj_play_start(int board){ unsigned short cmd = 0x0000; IXJ *j = &ixj[board]; j->flags.play_first_frame = 1; j->drybuffer = 0; if (!j->play_mode) { switch (j->play_codec) { case G723_63: cmd = 0x5231; break; case G723_53: cmd = 0x5232; break; case TS85: cmd = 0x5230; // TrueSpeech 8.5 break; case TS48: cmd = 0x5233; // TrueSpeech 4.8 break; case TS41: cmd = 0x5234; // TrueSpeech 4.1 break; case G728: cmd = 0x5235; break; case G729: cmd = 0x5236; break; default: return 1; } if (ixj_WriteDSPCommand(cmd, board)) return -1; } if (!j->write_buffer) { j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_KERNEL); if (!j->write_buffer) { printk("Write buffer allocation for ixj board %d failed!\n", board); return -ENOMEM; } } j->write_buffers_empty = 2; j->write_buffer_size = j->play_frame_size * 2; j->write_buffer_end = j->write_buffer + j->play_frame_size * 2; j->write_buffer_rp = j->write_buffer_wp = j->write_buffer; if (ixj_WriteDSPCommand(0x5202, board)) // Set Poll sync mode return -1; switch (j->play_mode) { case 0: cmd = 0x2C03; break; case 2: if (j->ver.low == 0x12) { cmd = 0x2C23; } else { cmd = 0x2C21; } break; case 4: if (j->ver.low == 0x12) { cmd = 0x2C43; } else { cmd = 0x2C41; } break; case 5: if (j->ver.low == 0x12) { cmd = 0x2C53; } else { cmd = 0x2C51; } break; case 6: if (j->ver.low == 0x12) { cmd = 0x2C63; } else { cmd = 0x2C61; } break; } if (ixj_WriteDSPCommand(cmd, board)) return -1; if (ixj_WriteDSPCommand(0x2000, board)) // Playback C2 return -1; if (ixj_WriteDSPCommand(0x2000 + ixj[board].play_frame_size, board)) // Playback C3 return -1; return 0;}static void ixj_play_stop(int board){ IXJ *j = &ixj[board]; if (j->play_mode > -1) { ixj_WriteDSPCommand(0x5221, board); // Stop playback j->play_mode = -1; }}extern __inline__ void set_play_depth(int board, int depth){ if (depth > 60) depth = 60; if (depth < 0) depth = 0; ixj_WriteDSPCommand(0x5280 + depth, board);}extern __inline__ void set_play_volume(int board, int volume){ ixj_WriteDSPCommand(0xCF02, board); ixj_WriteDSPCommand(volume, board);}extern __inline__ int get_play_level(int board){ ixj_WriteDSPCommand(0xCF8F, board); return ixj[board].ssr.high << 8 | ixj[board].ssr.low;}static unsigned int ixj_poll(struct file *file_p, poll_table * wait){ unsigned int mask = 0; IXJ *j = &ixj[NUM(file_p->f_dentry->d_inode->i_rdev)]; poll_wait(file_p, &(j->poll_q), wait); if (j->read_buffer_ready > 0) mask |= POLLIN | POLLRDNORM; /* readable */ if (j->write_buffers_empty > 0) mask |= POLLOUT | POLLWRNORM; /* writable */ if (j->ex.bytes) mask |= POLLPRI; return mask;}static int ixj_play_tone(int board, char tone){ IXJ *j = &ixj[board]; if (!j->tone_state)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -