All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.badlogic.gdx.backends.android.AndroidAudioDevice Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright 2011 See AUTHORS file.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

package com.badlogic.gdx.backends.android;

import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;

import com.badlogic.gdx.audio.AudioDevice;

/** Implementation of the {@link AudioDevice} interface for Android using the AudioTrack class. You will need to set the permission
 * android.permission.RECORD_AUDIO in your manifest file.
 * @author mzechner */
class AndroidAudioDevice implements AudioDevice {
	/** the audio track **/
	private final AudioTrack track;

	/** the mighty buffer **/
	private short[] buffer = new short[1024];

	/** whether this device is in mono or stereo mode **/
	private final boolean isMono;

	/** the latency in samples **/
	private final int latency;

	AndroidAudioDevice (int samplingRate, boolean isMono) {
		this.isMono = isMono;
		int minSize = AudioTrack.getMinBufferSize(samplingRate, isMono ? AudioFormat.CHANNEL_OUT_MONO
			: AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);
		track = new AudioTrack(AudioManager.STREAM_MUSIC, samplingRate, isMono ? AudioFormat.CHANNEL_OUT_MONO
			: AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, minSize, AudioTrack.MODE_STREAM);
		track.play();
		latency = minSize / (isMono ? 1 : 2);
	}

	@Override
	public void dispose () {
		track.stop();
		track.release();
	}

	@Override
	public boolean isMono () {
		return isMono;
	}

	@Override
	public void writeSamples (short[] samples, int offset, int numSamples) {
		int writtenSamples = track.write(samples, offset, numSamples);
		while (writtenSamples != numSamples)
			writtenSamples += track.write(samples, offset + writtenSamples, numSamples - writtenSamples);
	}

	@Override
	public void writeSamples (float[] samples, int offset, int numSamples) {
		if (buffer.length < samples.length) buffer = new short[samples.length];

		int bound = offset + numSamples;
		for (int i = offset, j = 0; i < bound; i++, j++) {
			float fValue = samples[i];
			if (fValue > 1) fValue = 1;
			if (fValue < -1) fValue = -1;
			short value = (short)(fValue * Short.MAX_VALUE);
			buffer[j] = value;
		}

		int writtenSamples = track.write(buffer, 0, numSamples);
		while (writtenSamples != numSamples)
			writtenSamples += track.write(buffer, writtenSamples, numSamples - writtenSamples);
	}

	@Override
	public int getLatency () {
		return latency;
	}

	@Override
	public void setVolume (float volume) {
		track.setStereoVolume(volume, volume);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy