19bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava/*
29bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Copyright (C) 2010 The Android Open Source Project
39bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava *
49bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Licensed under the Apache License, Version 2.0 (the "License");
59bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * you may not use this file except in compliance with the License.
69bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * You may obtain a copy of the License at
79bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava *
89bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava *      http://www.apache.org/licenses/LICENSE-2.0
99bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava *
109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * Unless required by applicable law or agreed to in writing, software
119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * distributed under the License is distributed on an "AS IS" BASIS,
129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * See the License for the specific language governing permissions and
149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * limitations under the License.
159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */
169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavapackage android.media.videoeditor;
199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.io.File;
219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.io.IOException;
229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport java.lang.ref.SoftReference;
239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavaimport android.media.videoeditor.MediaArtistNativeHelper.Properties;
259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava/**
279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * This class allows to handle an audio track. This audio file is mixed with the
289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * audio samples of the media items.
299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava * {@hide}
309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava */
319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhavapublic class AudioTrack {
329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  Instance variables
359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  Private object for calling native methods via MediaArtistNativeHelper
369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final MediaArtistNativeHelper mMANativeHelper;
389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final String mUniqueId;
399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final String mFilename;
409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private long mStartTimeMs;
419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private long mTimelineDurationMs;
429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private int mVolumePercent;
439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private long mBeginBoundaryTimeMs;
449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private long mEndBoundaryTimeMs;
459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private boolean mLoop;
469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private boolean mMuted;
479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final long mDurationMs;
489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mAudioChannels;
499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mAudioType;
509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mAudioBitrate;
519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private final int mAudioSamplingFrequency;
529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  Ducking variables
549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private int mDuckingThreshold;
569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private int mDuckedTrackVolume;
579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private boolean mIsDuckingEnabled;
589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  The audio waveform filename
619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private String mAudioWaveformFilename;
639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *  The audio waveform data
669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private SoftReference<WaveformData> mWaveformData;
689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * An object of this type cannot be instantiated by using the default
719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * constructor
729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @SuppressWarnings("unused")
749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    private AudioTrack() throws IOException {
759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        this(null, null, null);
769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Constructor
809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param editor The video editor reference
829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param audioTrackId The audio track id
839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param filename The absolute file name
849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IOException if file is not found
869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalArgumentException if file format is not supported or if
879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         the codec is not supported or if editor is not of type
889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         VideoEditorImpl.
899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public AudioTrack(VideoEditor editor, String audioTrackId, String filename) throws IOException {
919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        this(editor, audioTrackId, filename, 0, 0, MediaItem.END_OF_FILE, false, 100, false, false,
929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                0, 0, null);
939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Constructor
979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param editor The video editor reference
999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param audioTrackId The audio track id
1009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param filename The audio filename. In case file contains Audio and Video,
1019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         only the Audio stream will be used as Audio Track.
1029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param startTimeMs the start time in milliseconds (relative to the
1039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         timeline)
1049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param beginMs start time in the audio track in milliseconds (relative to
1059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         the beginning of the audio track)
1069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param endMs end time in the audio track in milliseconds (relative to the
1079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         beginning of the audio track)
1089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param loop true to loop the audio track
1099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param volume The volume in percentage
1109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param muted true if the audio track is muted
1119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param threshold Ducking will be activated when the relative energy in
1129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         the media items audio signal goes above this value. The valid
1139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         range of values is 0 to 90.
1149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param duckedTrackVolume The relative volume of the audio track when
1159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         ducking is active. The valid range of values is 0 to 100.
1169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param audioWaveformFilename The name of the waveform file
1179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
1189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IOException if file is not found
1199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalArgumentException if file format is not supported or if
1209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *             the codec is not supported or if editor is not of type
1219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *             VideoEditorImpl.
1229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
1239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    AudioTrack(VideoEditor editor, String audioTrackId, String filename,
1249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava               long startTimeMs,long beginMs, long endMs, boolean loop,
1259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava               int volume, boolean muted,boolean duckingEnabled,
1269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava               int duckThreshold, int duckedTrackVolume,
1279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            String audioWaveformFilename) throws IOException {
1289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        Properties properties = null;
1294d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav
1309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        File file = new File(filename);
1319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (!file.exists()) {
1329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IOException(filename + " not found ! ");
1339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
1349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1354d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav        /*Compare file_size with 2GB*/
1364d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav        if (VideoEditor.MAX_SUPPORTED_FILE_SIZE <= file.length()) {
1374d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav            throw new IllegalArgumentException("File size is more than 2GB");
1384d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav        }
1394d0ec22aa91428030ae9ef1ead6f1b1d769745acShailendra Yadav
1409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (editor instanceof VideoEditorImpl) {
1419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mMANativeHelper = ((VideoEditorImpl)editor).getNativeContext();
1429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else {
1439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("editor is not of type VideoEditorImpl");
1449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
1459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        try {
1469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava          properties = mMANativeHelper.getMediaProperties(filename);
1479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } catch (Exception e) {
148895a28e14e6c88b4ff3b1f1cdf02d22f7b3b52caSantosh Madhava            throw new IllegalArgumentException(e.getMessage() + " : " + filename);
1499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
150f58ba6506959947d2e646833789c859ae50e6767James Dong        int fileType = mMANativeHelper.getFileType(properties.fileType);
151f58ba6506959947d2e646833789c859ae50e6767James Dong        switch (fileType) {
1529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case MediaProperties.FILE_3GP:
1539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case MediaProperties.FILE_MP4:
1549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case MediaProperties.FILE_MP3:
155f58ba6506959947d2e646833789c859ae50e6767James Dong            case MediaProperties.FILE_AMR:
1569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                break;
1579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            default: {
159f58ba6506959947d2e646833789c859ae50e6767James Dong                throw new IllegalArgumentException("Unsupported input file type: " + fileType);
1609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
1619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
1629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        switch (mMANativeHelper.getAudioCodecType(properties.audioFormat)) {
1639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case MediaProperties.ACODEC_AMRNB:
1649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case MediaProperties.ACODEC_AMRWB:
1659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case MediaProperties.ACODEC_AAC_LC:
1669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            case MediaProperties.ACODEC_MP3:
1679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                break;
1689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            default:
1699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                throw new IllegalArgumentException("Unsupported Audio Codec Format in Input File");
1709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
1719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (endMs == MediaItem.END_OF_FILE) {
1739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            endMs = properties.audioDuration;
1749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
1759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mUniqueId = audioTrackId;
1779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mFilename = filename;
1789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mStartTimeMs = startTimeMs;
1799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mDurationMs = properties.audioDuration;
1809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mAudioChannels = properties.audioChannels;
1819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mAudioBitrate = properties.audioBitrate;
1829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mAudioSamplingFrequency = properties.audioSamplingFrequency;
1839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mAudioType = properties.audioFormat;
1849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mTimelineDurationMs = endMs - beginMs;
1859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mVolumePercent = volume;
1869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mBeginBoundaryTimeMs = beginMs;
1889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mEndBoundaryTimeMs = endMs;
1899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mLoop = loop;
1919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mMuted = muted;
1929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mIsDuckingEnabled = duckingEnabled;
1939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mDuckingThreshold = duckThreshold;
1949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mDuckedTrackVolume = duckedTrackVolume;
1959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
1969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mAudioWaveformFilename = audioWaveformFilename;
1979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (audioWaveformFilename != null) {
1989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mWaveformData =
1999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                new SoftReference<WaveformData>(new WaveformData(audioWaveformFilename));
2009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else {
2019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mWaveformData = null;
2029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
2039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the id of the audio track
2079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The id of the audio track
2099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public String getId() {
2119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mUniqueId;
2129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the filename for this audio track source.
2169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The filename as an absolute file name
2189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public String getFilename() {
2209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mFilename;
2219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the number of audio channels in the source of this audio track
2259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The number of audio channels in the source of this audio track
2279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getAudioChannels() {
2299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mAudioChannels;
2309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the audio codec of the source of this audio track
2349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The audio codec of the source of this audio track
2369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@link android.media.videoeditor.MediaProperties}
2379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getAudioType() {
2399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mAudioType;
2409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the audio sample frequency of the audio track
2449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The audio sample frequency of the audio track
2469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getAudioSamplingFrequency() {
2489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mAudioSamplingFrequency;
2499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the audio bitrate of the audio track
2539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The audio bitrate of the audio track
2559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getAudioBitrate() {
2579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mAudioBitrate;
2589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Set the volume of this audio track as percentage of the volume in the
2629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * original audio source file.
2639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param volumePercent Percentage of the volume to apply. If it is set to
2659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         0, then volume becomes mute. It it is set to 100, then volume
2669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         is same as original volume. It it is set to 200, then volume
2679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         is doubled (provided that volume amplification is supported)
2689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws UnsupportedOperationException if volume amplification is
2709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         requested and is not supported.
2719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void setVolume(int volumePercent) {
2739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (volumePercent > MediaProperties.AUDIO_MAX_VOLUME_PERCENT) {
2749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Volume set exceeds maximum allowed value");
2759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
2769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2772bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        if (volumePercent < 0) {
2789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Invalid Volume ");
2799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
2802bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi
2819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        /**
2829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         *  Force update of preview settings
2839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         */
2849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mMANativeHelper.setGeneratePreview(true);
2852bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi
2862bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        mVolumePercent = volumePercent;
2879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
2909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the volume of the audio track as percentage of the volume in the
2919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * original audio source file.
2929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
2939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The volume in percentage
2949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
2959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getVolume() {
2969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mVolumePercent;
2979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
2989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
2999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Mute/Unmute the audio track
3019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param muted true to mute the audio track. SetMute(true) will make
3039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         the volume of this Audio Track to 0.
3049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void setMute(boolean muted) {
3069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        /**
3079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         *  Force update of preview settings
3089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         */
3099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mMANativeHelper.setGeneratePreview(true);
3102bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        mMuted = muted;
3119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Check if the audio track is muted
3159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return true if the audio track is muted
3179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public boolean isMuted() {
3199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mMuted;
3209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the start time of this audio track relative to the storyboard
3249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * timeline.
3259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The start time in milliseconds
3279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public long getStartTime() {
3309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mStartTimeMs;
3319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the audio track duration
3359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The duration in milliseconds. This value represents actual audio
3379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         track duration. This value is not effected by 'enableLoop' or
3389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         'setExtractBoundaries'.
3399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public long getDuration() {
3419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mDurationMs;
3429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the audio track timeline duration
3469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The timeline duration as defined by the begin and end boundaries
3489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public long getTimelineDuration() {
3509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mTimelineDurationMs;
3519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Sets the start and end marks for trimming an audio track
3559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param beginMs start time in the audio track in milliseconds (relative to
3579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         the beginning of the audio track)
3589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param endMs end time in the audio track in milliseconds (relative to the
3599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         beginning of the audio track)
3609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void setExtractBoundaries(long beginMs, long endMs) {
3629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (beginMs > mDurationMs) {
3639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Invalid start time");
3649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (endMs > mDurationMs) {
3669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Invalid end time");
3679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (beginMs < 0) {
3699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Invalid start time; is < 0");
3709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (endMs < 0) {
3729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Invalid end time; is < 0");
3739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
3749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        /**
3769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         *  Force update of preview settings
3779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         */
3789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mMANativeHelper.setGeneratePreview(true);
3792bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi
3802bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        mBeginBoundaryTimeMs = beginMs;
3812bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        mEndBoundaryTimeMs = endMs;
3822bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi
3832bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        mTimelineDurationMs = mEndBoundaryTimeMs - mBeginBoundaryTimeMs;
3849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the boundary begin time
3889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The boundary begin time
3909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
3919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public long getBoundaryBeginTime() {
3929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mBeginBoundaryTimeMs;
3939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
3949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
3959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
3969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the boundary end time
3979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
3989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The boundary end time
3999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public long getBoundaryEndTime() {
4019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mEndBoundaryTimeMs;
4029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Enable the loop mode for this audio track. Note that only one of the
4069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * audio tracks in the timeline can have the loop mode enabled. When looping
4079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * is enabled the samples between mBeginBoundaryTimeMs and
4089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * mEndBoundaryTimeMs are looped.
4099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void enableLoop() {
4119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (!mLoop) {
4129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /**
4139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             *  Force update of preview settings
4149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
4159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mMANativeHelper.setGeneratePreview(true);
416a573b563b3c6a3edc60393543dc9adb7ade4f188Dharmaray Kundargi            mLoop = true;
4179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Disable the loop mode
4229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void disableLoop() {
4249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mLoop) {
4259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /**
4269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             *  Force update of preview settings
4279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
4289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mMANativeHelper.setGeneratePreview(true);
4292bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi            mLoop = false;
4309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Check if looping is enabled
4359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
4369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return true if looping is enabled
4379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public boolean isLooping() {
4399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mLoop;
4409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Disable the audio duck effect
4449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void disableDucking() {
4469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mIsDuckingEnabled) {
4479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /**
4489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             *  Force update of preview settings
4499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
4509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mMANativeHelper.setGeneratePreview(true);
4512bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi            mIsDuckingEnabled = false;
4529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Enable ducking by specifying the required parameters
4579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
4589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param threshold Ducking will be activated when the energy in
4599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         the media items audio signal goes above this value. The valid
4609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         range of values is 0db to 90dB. 0dB is equivalent to disabling
4619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         ducking.
4629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param duckedTrackVolume The relative volume of the audio track when ducking
4639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         is active. The valid range of values is 0 to 100.
4649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void enableDucking(int threshold, int duckedTrackVolume) {
4669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (threshold < 0 || threshold > 90) {
4679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Invalid threshold value: " + threshold);
4689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (duckedTrackVolume < 0 || duckedTrackVolume > 100) {
4719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            throw new IllegalArgumentException("Invalid duckedTrackVolume value: "
4729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    + duckedTrackVolume);
4739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
4749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        /**
4769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         *  Force update of preview settings
4779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava         */
4789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mMANativeHelper.setGeneratePreview(true);
4792bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi
4802bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        mDuckingThreshold = threshold;
4812bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        mDuckedTrackVolume = duckedTrackVolume;
4822bb13573d619e3371d06847d36db78a20b17dfabGil Dobjanschi        mIsDuckingEnabled = true;
4839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Check if ducking is enabled
4879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
4889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return true if ducking is enabled
4899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public boolean isDuckingEnabled() {
4919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mIsDuckingEnabled;
4929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
4939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
4949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
4959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the ducking threshold.
4969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
4979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The ducking threshold
4989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
4999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getDuckingThreshhold() {
5009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mDuckingThreshold;
5019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
5029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
5049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the ducked track volume.
5059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The ducked track volume
5079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
5089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int getDuckedTrackVolume() {
5099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mDuckedTrackVolume;
5109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
5119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
5139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * This API allows to generate a file containing the sample volume levels of
5149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * this audio track object. This function may take significant time and is
5159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * blocking. The filename can be retrieved using getAudioWaveformFilename().
5169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @param listener The progress listener
5189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IOException if the output file cannot be created
5209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalArgumentException if the audio file does not have a valid
5219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *         audio track
5229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IllegalStateException if the codec type is unsupported
5239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
5249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public void extractAudioWaveform(ExtractAudioWaveformProgressListener listener)
5259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    throws IOException {
5269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mAudioWaveformFilename == null) {
5279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /**
5289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             *  AudioWaveformFilename is generated
5299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
5309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final String projectPath = mMANativeHelper.getProjectPath();
5319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final String audioWaveFilename = String.format(projectPath + "/audioWaveformFile-"
5329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    + getId() + ".dat");
5339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /**
5359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * Logic to get frame duration = (no. of frames per sample * 1000)/
5369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             * sampling frequency
5379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
5389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final int frameDuration;
5399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final int sampleCount;
5409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            final int codecType = mMANativeHelper.getAudioCodecType(mAudioType);
5419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            switch (codecType) {
5429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                case MediaProperties.ACODEC_AMRNB: {
5439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    frameDuration = (MediaProperties.SAMPLES_PER_FRAME_AMRNB * 1000)
5449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    / MediaProperties.DEFAULT_SAMPLING_FREQUENCY;
5459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    sampleCount = MediaProperties.SAMPLES_PER_FRAME_AMRNB;
5469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    break;
5479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                }
5489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                case MediaProperties.ACODEC_AMRWB: {
5509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    frameDuration = (MediaProperties.SAMPLES_PER_FRAME_AMRWB * 1000)
5519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    / MediaProperties.DEFAULT_SAMPLING_FREQUENCY;
5529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    sampleCount = MediaProperties.SAMPLES_PER_FRAME_AMRWB;
5539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    break;
5549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                }
5559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                case MediaProperties.ACODEC_AAC_LC: {
5579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    frameDuration = (MediaProperties.SAMPLES_PER_FRAME_AAC * 1000)
5589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    / MediaProperties.DEFAULT_SAMPLING_FREQUENCY;
5599bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    sampleCount = MediaProperties.SAMPLES_PER_FRAME_AAC;
5609bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    break;
5619bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                }
5629bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5639bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                case MediaProperties.ACODEC_MP3: {
5649bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    frameDuration = (MediaProperties.SAMPLES_PER_FRAME_MP3 * 1000)
5659bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    / MediaProperties.DEFAULT_SAMPLING_FREQUENCY;
5669bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    sampleCount = MediaProperties.SAMPLES_PER_FRAME_MP3;
5679bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    break;
5689bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                }
5699bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5709bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                default: {
5719bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    throw new IllegalStateException("Unsupported codec type: "
5729bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                                                                   + codecType);
5739bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                }
5749bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
5759bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5769bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mMANativeHelper.generateAudioGraph( mUniqueId,
5779bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    mFilename,
5789bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    audioWaveFilename,
5799bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    frameDuration,
5809bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    MediaProperties.DEFAULT_CHANNEL_COUNT,
5819bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    sampleCount,
5829bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    listener,
5839bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                    false);
5849bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            /**
5859bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             *  Record the generated file name
5869bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava             */
5879bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mAudioWaveformFilename = audioWaveFilename;
5889bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
5899bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        mWaveformData = new SoftReference<WaveformData>(new WaveformData(mAudioWaveformFilename));
5909bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
5919bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
5929bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
5939bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the audio waveform file name if extractAudioWaveform was successful.
5949bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
5959bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return the name of the file, null if the file does not exist
5969bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
5979bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    String getAudioWaveformFilename() {
5989bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mAudioWaveformFilename;
5999bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6009bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6019bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6029bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Delete the waveform file
6039bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6049bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    void invalidate() {
6059bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mAudioWaveformFilename != null) {
6069bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            new File(mAudioWaveformFilename).delete();
6079bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mAudioWaveformFilename = null;
6089bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mWaveformData = null;
6099bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6109bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6119bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6129bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /**
6139bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * Get the audio waveform data.
6149bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
6159bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @return The waveform data
6169bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     *
6179bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * @throws IOException if the waveform file cannot be found
6189bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6199bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public WaveformData getWaveformData() throws IOException {
6209bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (mWaveformData == null) {
6219bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return null;
6229bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6239bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6249bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        WaveformData waveformData = mWaveformData.get();
6259bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (waveformData != null) {
6269bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return waveformData;
6279bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else if (mAudioWaveformFilename != null) {
6289bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            try {
6299bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                waveformData = new WaveformData(mAudioWaveformFilename);
6309bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            } catch (IOException e) {
6319bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava                throw e;
6329bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            }
6339bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            mWaveformData = new SoftReference<WaveformData>(waveformData);
6349bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return waveformData;
6359bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        } else {
6369bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return null;
6379bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6389bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6399bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6409bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
6419bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
6429bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6439bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
6449bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public boolean equals(Object object) {
6459bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        if (!(object instanceof AudioTrack)) {
6469bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava            return false;
6479bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        }
6489bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mUniqueId.equals(((AudioTrack)object).mUniqueId);
6499bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6509bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava
6519bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    /*
6529bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     * {@inheritDoc}
6539bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava     */
6549bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    @Override
6559bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    public int hashCode() {
6569bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava        return mUniqueId.hashCode();
6579bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava    }
6589bcedf7cf3e9c981837f2d8ec98cd118efad3f01Santosh Madhava}
659