package com.netthreads.libgdx.sound.pitch;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.ShortBuffer;
/**
* Helper class to build 'wav' file format in memory.
*
* Format: https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
*/
public class WaveHelper
{
public static final String TYPE = "wav";
private static byte[] WAVE_HEADER =
{
'R', 'I', 'F', 'F',
0x00, 0x00, 0x00, 0x00,
'W', 'A', 'V', 'E',
'f', 'm', 't', ' ', /* Subchunk1ID */
0x10, 0x00, 0x00, 0x00, /* Subchunk1Size */
0x01, 0x00, /* AudioFormat */
0x02, 0x00, /* NumChannels */
0x44, (byte) 0xAC, 0x00, /* SampleRate */
0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x10, 0x00, /* BitsPerSample */
'd', 'a', 't', 'a',
0x00, 0x00, 0x00, 0x00
};
/**
* Build data for stream.
*
* @param channels Number of channels.
* @param sampleRate The sample rate.
* @param shortBuffer A buffer of sample data.
* @return A byte byte buffer representing 'wav' file contents.
*/
public static byte[] buildStream(int channels, int sampleRate, ShortBuffer shortBuffer)
{
// Extract into bytes
int size = shortBuffer.capacity() * 2;
byte[] bytes = new byte[WAVE_HEADER.length + (size)];
// Number of channels.
WAVE_HEADER[22] = (byte) (channels & 0xff);
WAVE_HEADER[23] = (byte) ((channels >>8) & 0xff);
// Sample rate.
WAVE_HEADER[24] = (byte) (sampleRate & 0xff);
WAVE_HEADER[25] = (byte) ((sampleRate >> 8) & 0xff);
WAVE_HEADER[26] = (byte) ((sampleRate >> 16) & 0xff);
WAVE_HEADER[27] = (byte) ((sampleRate >> 24) & 0xff);
// Set sample size.
WAVE_HEADER[40] = (byte) (size & 0xff);
WAVE_HEADER[41] = (byte) ((size >> 8) & 0xff);
WAVE_HEADER[42] = (byte) ((size >> 16) & 0xff);
WAVE_HEADER[43] = (byte) ((size >> 24) & 0xff);
ByteBuffer.wrap(bytes).put(WAVE_HEADER).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(shortBuffer);
return bytes;
}
}