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