Loading media/java/android/media/AudioFormat.java +23 −0 Original line number Diff line number Diff line Loading @@ -126,6 +126,29 @@ public class AudioFormat { CHANNEL_OUT_LOW_FREQUENCY); // CHANNEL_OUT_ALL is not yet defined; if added then it should match AUDIO_CHANNEL_OUT_ALL /** * @hide * Return the input channel mask corresponding to an output channel mask. * This can be used for submix rerouting for the mask of the recorder to map to that of the mix. * @param outMask a combination of the CHANNEL_OUT_* definitions, but not CHANNEL_OUT_DEFAULT * @return a combination of CHANNEL_IN_* definitions matching an output channel mask * @throws IllegalArgumentException */ public static int inChannelMaskFromOutChannelMask(int outMask) throws IllegalArgumentException { if (outMask == CHANNEL_OUT_DEFAULT) { throw new IllegalArgumentException( "Illegal CHANNEL_OUT_DEFAULT channel mask for input."); } switch (channelCountFromOutChannelMask(outMask)) { case 1: return CHANNEL_IN_MONO; case 2: return CHANNEL_IN_STEREO; default: throw new IllegalArgumentException("Unsupported channel configuration for input."); } } /** * @hide * Return the number of channels from an input channel mask Loading media/java/android/media/audiopolicy/AudioPolicy.java +8 −1 Original line number Diff line number Diff line Loading @@ -155,6 +155,7 @@ public class AudioPolicy { { throw new IllegalArgumentException("Invalid AudioMix: not defined for loop back"); } // TODO also check mix is defined for playback or recording, and matches forTrack argument } /** Loading @@ -175,13 +176,19 @@ public class AudioPolicy { return null; } checkMixReadyToUse(mix, false/*not for an AudioTrack*/); // create an AudioFormat from the mix format compatible with recording, as the mix // was defined for playback AudioFormat mixFormat = new AudioFormat.Builder(mix.getFormat()) .setChannelMask(AudioFormat.inChannelMaskFromOutChannelMask( mix.getFormat().getChannelMask())) .build(); // create the AudioRecord, configured for loop back, using the same format as the mix AudioRecord ar = new AudioRecord( new AudioAttributes.Builder() .setInternalCapturePreset(MediaRecorder.AudioSource.REMOTE_SUBMIX) .addTag(mix.getRegistration()) .build(), mix.getFormat(), mixFormat, AudioRecord.getMinBufferSize(mix.getFormat().getSampleRate(), // using stereo for buffer size to avoid the current poor support for masks AudioFormat.CHANNEL_IN_STEREO, mix.getFormat().getEncoding()), Loading Loading
media/java/android/media/AudioFormat.java +23 −0 Original line number Diff line number Diff line Loading @@ -126,6 +126,29 @@ public class AudioFormat { CHANNEL_OUT_LOW_FREQUENCY); // CHANNEL_OUT_ALL is not yet defined; if added then it should match AUDIO_CHANNEL_OUT_ALL /** * @hide * Return the input channel mask corresponding to an output channel mask. * This can be used for submix rerouting for the mask of the recorder to map to that of the mix. * @param outMask a combination of the CHANNEL_OUT_* definitions, but not CHANNEL_OUT_DEFAULT * @return a combination of CHANNEL_IN_* definitions matching an output channel mask * @throws IllegalArgumentException */ public static int inChannelMaskFromOutChannelMask(int outMask) throws IllegalArgumentException { if (outMask == CHANNEL_OUT_DEFAULT) { throw new IllegalArgumentException( "Illegal CHANNEL_OUT_DEFAULT channel mask for input."); } switch (channelCountFromOutChannelMask(outMask)) { case 1: return CHANNEL_IN_MONO; case 2: return CHANNEL_IN_STEREO; default: throw new IllegalArgumentException("Unsupported channel configuration for input."); } } /** * @hide * Return the number of channels from an input channel mask Loading
media/java/android/media/audiopolicy/AudioPolicy.java +8 −1 Original line number Diff line number Diff line Loading @@ -155,6 +155,7 @@ public class AudioPolicy { { throw new IllegalArgumentException("Invalid AudioMix: not defined for loop back"); } // TODO also check mix is defined for playback or recording, and matches forTrack argument } /** Loading @@ -175,13 +176,19 @@ public class AudioPolicy { return null; } checkMixReadyToUse(mix, false/*not for an AudioTrack*/); // create an AudioFormat from the mix format compatible with recording, as the mix // was defined for playback AudioFormat mixFormat = new AudioFormat.Builder(mix.getFormat()) .setChannelMask(AudioFormat.inChannelMaskFromOutChannelMask( mix.getFormat().getChannelMask())) .build(); // create the AudioRecord, configured for loop back, using the same format as the mix AudioRecord ar = new AudioRecord( new AudioAttributes.Builder() .setInternalCapturePreset(MediaRecorder.AudioSource.REMOTE_SUBMIX) .addTag(mix.getRegistration()) .build(), mix.getFormat(), mixFormat, AudioRecord.getMinBufferSize(mix.getFormat().getSampleRate(), // using stereo for buffer size to avoid the current poor support for masks AudioFormat.CHANNEL_IN_STEREO, mix.getFormat().getEncoding()), Loading