void audio_input_mux(int source, unsigned flags) { /* Prevent pops from unneeded switching */ static int last_source = AUDIO_SRC_PLAYBACK; bool recording = flags & SRCF_RECORDING; static bool last_recording = false; switch(source) { default: /* playback - no recording */ source = AUDIO_SRC_PLAYBACK; case AUDIO_SRC_PLAYBACK: if (source != last_source) { audiohw_set_recsrc(source,false); coldfire_set_dataincontrol(0); } break; case AUDIO_SRC_MIC: case AUDIO_SRC_LINEIN: /* recording only */ if (source != last_source) { audiohw_set_recsrc(source,true); /* Int. when 6 samples in FIFO, PDIR2 src = iis1RcvData */ coldfire_set_dataincontrol((3 << 14) | (4 << 3)); } break; case AUDIO_SRC_FMRADIO: if (source == last_source && recording == last_recording) break; last_recording = recording; audiohw_set_recsrc(source,recording); /* Int. when 6 samples in FIFO, PDIR2 src = iis1RcvData */ coldfire_set_dataincontrol(recording ? ((3 << 14) | (4 << 3)) : 0); break; } last_source = source; }
void audio_input_mux(int source, unsigned flags) { /* Prevent pops from unneeded switching */ static int last_source = AUDIO_SRC_PLAYBACK; #ifdef HAVE_FMRADIO_IN static bool last_recording = false; bool recording = flags & SRCF_RECORDING; #else (void)flags; #endif switch (source) { default: /* playback - no recording */ source = AUDIO_SRC_PLAYBACK; case AUDIO_SRC_PLAYBACK: if (source != last_source) { audiohw_disable_recording(); audiohw_set_monitor(false); coldfire_set_dataincontrol(0); } break; case AUDIO_SRC_MIC: /* recording only */ if (source != last_source) { audiohw_enable_recording(true); /* source mic */ /* Int. when 6 samples in FIFO, PDIR2 src = iis1RcvData */ coldfire_set_dataincontrol((3 << 14) | (4 << 3)); } break; case AUDIO_SRC_LINEIN: /* recording only */ if (source != last_source) { audiohw_enable_recording(false); /* source line */ /* Int. when 6 samples in FIFO, PDIR2 src = iis1RcvData */ coldfire_set_dataincontrol((3 << 14) | (4 << 3)); } break; #ifdef HAVE_FMRADIO_IN case AUDIO_SRC_FMRADIO: /* recording and playback */ if (!recording) audiohw_set_recvol(23, 23, AUDIO_GAIN_LINEIN); /* I2S recording and analog playback */ if (source == last_source && recording == last_recording) break; last_recording = recording; if (recording) { /* Int. when 6 samples in FIFO, PDIR2 src = iis1RcvData */ coldfire_set_dataincontrol((3 << 14) | (4 << 3)); audiohw_enable_recording(false); /* source line */ } else { audiohw_disable_recording(); audiohw_set_monitor(true); /* analog bypass */ coldfire_set_dataincontrol(0); } break; #endif /* HAVE_FMRADIO_IN */ } /* end switch */ /* set line multiplexer */ #ifdef IAUDIO_M3 #ifdef HAVE_FMRADIO_IN if (source == AUDIO_SRC_FMRADIO) and_l(~(1 << 25), &GPIO1_OUT); /* FM radio */ else #endif or_l((1 << 25), &GPIO1_OUT); /* Line In */ or_l((1 << 25), &GPIO1_ENABLE); or_l((1 << 25), &GPIO1_FUNCTION); #else /* iAudio M5, X5 */ #ifdef HAVE_FMRADIO_IN if (source == AUDIO_SRC_FMRADIO) and_l(~(1 << 29), &GPIO_OUT); /* FM radio */ else #endif or_l((1 << 29), &GPIO_OUT); /* Line In */ or_l((1 << 29), &GPIO_ENABLE); or_l((1 << 29), &GPIO_FUNCTION); #endif /* iAudio M5, X5 */ last_source = source; } /* audio_input_mux */