/** * Gets an AudioRecord object using the current recording settings * * @param context Context which we are getting recorder for */ public static AudioRecord getRecorder(Context context) throws IllegalArgumentException { AudioRecord recorder = null; int sampleRate = PreferenceHelper.getSampleRate(context); int bufferSize = PreferenceHelper.getBufferSize(context); int bufferSizeAdjuster = PreferenceHelper.getBufferSizeAdjuster(context); int audioSource = AudioSource.MIC; Log.i( TAG_AUDIOHELPER, String.format( "AudioRecord initialized with saved configuration! sample rate: %d, buffer: %d, buffer adjuster: %d", sampleRate, bufferSize, bufferSizeAdjuster)); recorder = new AudioRecord( audioSource, sampleRate, Constants.DEFAULT_CHANNEL_CONFIG, Constants.DEFAULT_PCM_FORMAT, bufferSize * bufferSizeAdjuster); if (recorder.getState() != AudioRecord.STATE_INITIALIZED) { throw new IllegalArgumentException( String.format( "unable to initialize AudioRecord instance, sample rate: %d, channels: %d, buffer: %d", sampleRate, Constants.DEFAULT_CHANNEL_CONFIG, bufferSize)); } return recorder; }
/** * Gets an AudioTrack object using the current playback settings * * @param context Context which we are getting recorder for */ public static AudioTrack getPlayer(Context context) throws IllegalArgumentException { AudioTrack player = null; int sampleRate = PreferenceHelper.getSampleRate(context); int bufferSizeAdjuster = PreferenceHelper.getBufferSizeAdjuster(context); Log.i( TAG_AUDIOHELPER, String.format( "AudioTrack initialized with saved configuration! sample rate: %d, buffer adjuster: %d", sampleRate, bufferSizeAdjuster)); int bufferSize = AudioTrack.getMinBufferSize( sampleRate, Constants.DEFAULT_CHANNEL_CONFIG, Constants.DEFAULT_PCM_FORMAT) * bufferSizeAdjuster; player = new AudioTrack( AudioManager.STREAM_MUSIC, sampleRate, Constants.DEFAULT_CHANNEL_CONFIG, Constants.DEFAULT_PCM_FORMAT, bufferSize, AudioTrack.MODE_STREAM); if (player.getState() != AudioTrack.STATE_INITIALIZED) { throw new IllegalArgumentException( String.format( "unable to initialize AudioTrack instance, sample rate: %d, channels: %d, buffer: %d", sampleRate, Constants.DEFAULT_CHANNEL_CONFIG, bufferSize)); } return player; }
/** * Attempts to autoconfigure current Context's sample rate, buffer size, or buffer size adjuster . * Will show a pop-up warning if configuration failed to initialize an AudioRecord instance. * * @param context Context which we are attempting to configure */ public static void configureRecorder(Context context) { AudioRecord rec = null; int sampleRate = PreferenceHelper.getSampleRate(context); int bufferSize = PreferenceHelper.getBufferSize(context); int bufferSizeAdjuster = PreferenceHelper.getBufferSizeAdjuster(context); if (sampleRate < 0 || bufferSize < 0 || bufferSizeAdjuster < 0) { if (AudioHelper.isSamsungGalaxyS()) { // bypass checking, go with defaults bufferSize = 6144; bufferSizeAdjuster = 1; sampleRate = Constants.SAMPLE_RATE_22KHZ; Log.i( TAG_AUDIOHELPER, String.format( "AudioRecord initially configured! sample rate: %d, buffer size: %d, buffer size adjuster: %d", sampleRate, bufferSize, bufferSizeAdjuster)); PreferenceHelper.setSampleRate(context, sampleRate); PreferenceHelper.setBufferSize(context, bufferSize); PreferenceHelper.setBufferSizeAdjuster(context, bufferSizeAdjuster); return; } if (bufferSizeAdjuster < 1) { // clamp buffer size adjuster to minimum of 1 bufferSizeAdjuster = 1; } // try a new sample rates until we find one that works do { switch (sampleRate) { case -1: // set the default to 22050Hz, so slower devices perform // better sampleRate = Constants.SAMPLE_RATE_22KHZ; break; case Constants.SAMPLE_RATE_44KHZ: sampleRate = Constants.SAMPLE_RATE_22KHZ; break; case Constants.SAMPLE_RATE_22KHZ: sampleRate = Constants.SAMPLE_RATE_11KHZ; break; case Constants.SAMPLE_RATE_11KHZ: sampleRate = Constants.SAMPLE_RATE_8KHZ; break; default: // start the loop over again with a larger buffer size bufferSizeAdjuster *= 2; sampleRate = Constants.SAMPLE_RATE_22KHZ; } bufferSize = AudioRecord.getMinBufferSize( sampleRate, Constants.DEFAULT_CHANNEL_CONFIG, Constants.DEFAULT_PCM_FORMAT); if (bufferSize != AudioRecord.ERROR && bufferSize != AudioRecord.ERROR_BAD_VALUE) { if (bufferSize <= 4096) { bufferSize = 4096 * 3 / 2; } rec = new AudioRecord( AudioSource.MIC, sampleRate, Constants.DEFAULT_CHANNEL_CONFIG, Constants.DEFAULT_PCM_FORMAT, bufferSize * bufferSizeAdjuster); if (rec != null && rec.getState() == AudioRecord.STATE_INITIALIZED) { rec.release(); rec = null; Log.i( TAG_AUDIOHELPER, String.format( "AudioRecord initially configured! sample rate: %d, buffer size: %d, buffer size adjuster: %d", sampleRate, bufferSize, bufferSizeAdjuster)); PreferenceHelper.setSampleRate(context, sampleRate); PreferenceHelper.setBufferSize(context, bufferSize); PreferenceHelper.setBufferSizeAdjuster(context, bufferSizeAdjuster); return; } if (rec != null) { rec.release(); rec = null; } } } while (bufferSizeAdjuster < Constants.DEFAULT_BUFFER_LIMIT); // failure to configure! DialogHelper.showWarning( context, R.string.unable_to_configure_audio_title, R.string.unable_to_configure_audio_warning); } }