/*
* Copyright (C) 2010 The Android Open Source Project
*
* 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 android.media.videoeditor;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* Class which describes the waveform data of an audio track. The gain values
* represent the average gain for an audio frame. For audio codecs which do not
* operate on a per frame bases (eg. ALAW, ULAW) a reasonable audio frame
* duration will be assumed (eg. 50ms).
* {@hide}
*/
public class WaveformData {
/*
* Instance variables
*/
private final int mFrameDurationMs;
private final int mFramesCount;
private final short[] mGains;
/*
* This constructor shall not be used
*/
@SuppressWarnings("unused")
private WaveformData() throws IOException {
mFrameDurationMs = 0;
mFramesCount = 0;
mGains = null;
}
/*
* Constructor
*
* @param audioWaveformFilename The name of the audio waveform file
*
* The file format is as following:
*
* - first 4 bytes provide the number of samples for each value, as
* big-endian signed
* - 4 following bytes is the total number of values in the file, as
* big-endian signed
* - then, all values follow as bytes
*
*
* @throws IOException on failure of file input stream operations
* @throws IllegalArgumentException if audioWaveformFilename is null
*/
WaveformData(String audioWaveformFilename) throws IOException {
if (audioWaveformFilename == null) {
throw new IllegalArgumentException("WaveformData : filename is null");
}
FileInputStream audioGraphFileReadHandle = null;
try {
final File audioGraphFileContext = new File(audioWaveformFilename);
audioGraphFileReadHandle = new FileInputStream(audioGraphFileContext);
/*
* Read frame duration
*/
final byte tempFrameDuration[] = new byte[4];
audioGraphFileReadHandle.read(tempFrameDuration, 0, 4);
int tempFrameDurationMs = 0;
int tempFramesCounter = 0;
for (int i = 0; i < 4; i++) {
tempFrameDurationMs = (tempFrameDurationMs << 8);
tempFrameDurationMs = (tempFrameDurationMs | (tempFrameDuration[i] & 0xff));
}
mFrameDurationMs = tempFrameDurationMs;
/*
* Read count
*/
final byte tempFramesCount[] = new byte[4];
audioGraphFileReadHandle.read(tempFramesCount, 0, 4);
for (int i = 0; i < 4; i++) {
tempFramesCounter = (tempFramesCounter << 8);
tempFramesCounter = (tempFramesCounter | (tempFramesCount[i] & 0xff));
}
mFramesCount = tempFramesCounter;
/*
* Capture the graph values
*/
mGains = new short[mFramesCount];
for (int i = 0; i < mFramesCount; i++) {
mGains[i] = (short)audioGraphFileReadHandle.read();
}
} finally {
if (audioGraphFileReadHandle != null) {
audioGraphFileReadHandle.close();
}
}
}
/**
* @return The duration of a frame in milliseconds
*/
public int getFrameDuration() {
return mFrameDurationMs;
}
/**
* @return The number of frames within the waveform data
*/
public int getFramesCount() {
return mFramesCount;
}
/**
* @return The array of frame gains. The size of the array is the frames
* count. The values of the frame gains range from 0 to 255.
*/
public short[] getFrameGains() {
return mGains;
}
}