| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.media; | 5 package org.chromium.media; |
| 6 | 6 |
| 7 import android.bluetooth.BluetoothAdapter; | 7 import android.bluetooth.BluetoothAdapter; |
| 8 import android.bluetooth.BluetoothManager; | 8 import android.bluetooth.BluetoothManager; |
| 9 import android.content.BroadcastReceiver; | 9 import android.content.BroadcastReceiver; |
| 10 import android.content.ContentResolver; | 10 import android.content.ContentResolver; |
| 11 import android.content.Context; | 11 import android.content.Context; |
| 12 import android.content.Intent; | 12 import android.content.Intent; |
| 13 import android.content.IntentFilter; | 13 import android.content.IntentFilter; |
| 14 import android.content.pm.PackageManager; | 14 import android.content.pm.PackageManager; |
| 15 import android.database.ContentObserver; | 15 import android.database.ContentObserver; |
| 16 import android.media.AudioFormat; | 16 import android.media.AudioFormat; |
| 17 import android.media.AudioManager; | 17 import android.media.AudioManager; |
| 18 import android.media.AudioRecord; | 18 import android.media.AudioRecord; |
| 19 import android.media.AudioTrack; | 19 import android.media.AudioTrack; |
| 20 import android.media.audiofx.AcousticEchoCanceler; |
| 20 import android.os.Build; | 21 import android.os.Build; |
| 21 import android.os.Handler; | 22 import android.os.Handler; |
| 22 import android.os.Looper; | 23 import android.os.Looper; |
| 23 import android.os.Process; | 24 import android.os.Process; |
| 24 import android.provider.Settings; | 25 import android.provider.Settings; |
| 25 import android.util.Log; | 26 import android.util.Log; |
| 26 | 27 |
| 27 import org.chromium.base.CalledByNative; | 28 import org.chromium.base.CalledByNative; |
| 28 import org.chromium.base.JNINamespace; | 29 import org.chromium.base.JNINamespace; |
| 29 | 30 |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 i++; | 304 i++; |
| 304 } | 305 } |
| 305 } | 306 } |
| 306 logd("getAudioInputDeviceNames: " + devices); | 307 logd("getAudioInputDeviceNames: " + devices); |
| 307 return array; | 308 return array; |
| 308 } | 309 } |
| 309 } | 310 } |
| 310 | 311 |
| 311 @CalledByNative | 312 @CalledByNative |
| 312 private int getNativeOutputSampleRate() { | 313 private int getNativeOutputSampleRate() { |
| 313 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.J
ELLY_BEAN_MR1) { | 314 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { |
| 314 String sampleRateString = mAudioManager.getProperty( | 315 String sampleRateString = mAudioManager.getProperty( |
| 315 AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); | 316 AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE); |
| 316 return (sampleRateString == null ? | 317 return (sampleRateString == null ? |
| 317 DEFAULT_SAMPLING_RATE : Integer.parseInt(sampleRateString)); | 318 DEFAULT_SAMPLING_RATE : Integer.parseInt(sampleRateString)); |
| 318 } else { | 319 } else { |
| 319 return DEFAULT_SAMPLING_RATE; | 320 return DEFAULT_SAMPLING_RATE; |
| 320 } | 321 } |
| 321 } | 322 } |
| 322 | 323 |
| 323 /** | 324 /** |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 } | 368 } |
| 368 | 369 |
| 369 @CalledByNative | 370 @CalledByNative |
| 370 private int getAudioLowLatencyOutputFrameSize() { | 371 private int getAudioLowLatencyOutputFrameSize() { |
| 371 String framesPerBuffer = | 372 String framesPerBuffer = |
| 372 mAudioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PE
R_BUFFER); | 373 mAudioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PE
R_BUFFER); |
| 373 return (framesPerBuffer == null ? | 374 return (framesPerBuffer == null ? |
| 374 DEFAULT_FRAME_PER_BUFFER : Integer.parseInt(framesPerBuffer)); | 375 DEFAULT_FRAME_PER_BUFFER : Integer.parseInt(framesPerBuffer)); |
| 375 } | 376 } |
| 376 | 377 |
| 378 @CalledByNative |
| 379 public static boolean shouldUseAcousticEchoCanceler() { |
| 380 // AcousticEchoCanceler was added in API level 16 (Jelly Bean). |
| 381 // Next is a list of device models which have been vetted for good |
| 382 // quality platform echo cancellation. |
| 383 return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && |
| 384 AcousticEchoCanceler.isAvailable() && |
| 385 (Build.MODEL.equals("Nexus 5") || |
| 386 Build.MODEL.equals("Nexus 7")); |
| 387 } |
| 388 |
| 377 /** Sets the speaker phone mode. */ | 389 /** Sets the speaker phone mode. */ |
| 378 public void setSpeakerphoneOn(boolean on) { | 390 public void setSpeakerphoneOn(boolean on) { |
| 379 boolean wasOn = mAudioManager.isSpeakerphoneOn(); | 391 boolean wasOn = mAudioManager.isSpeakerphoneOn(); |
| 380 if (wasOn == on) { | 392 if (wasOn == on) { |
| 381 return; | 393 return; |
| 382 } | 394 } |
| 383 mAudioManager.setSpeakerphoneOn(on); | 395 mAudioManager.setSpeakerphoneOn(on); |
| 384 } | 396 } |
| 385 | 397 |
| 386 /** Sets the microphone mute state. */ | 398 /** Sets the microphone mute state. */ |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 } | 603 } |
| 592 } | 604 } |
| 593 | 605 |
| 594 private void logDeviceInfo() { | 606 private void logDeviceInfo() { |
| 595 Log.i(TAG, "Manufacturer:" + Build.MANUFACTURER + | 607 Log.i(TAG, "Manufacturer:" + Build.MANUFACTURER + |
| 596 " Board: " + Build.BOARD + " Device: " + Build.DEVICE + | 608 " Board: " + Build.BOARD + " Device: " + Build.DEVICE + |
| 597 " Model: " + Build.MODEL + " PRODUCT: " + Build.PRODUCT); | 609 " Model: " + Build.MODEL + " PRODUCT: " + Build.PRODUCT); |
| 598 } | 610 } |
| 599 | 611 |
| 600 /** Trivial helper method for debug logging */ | 612 /** Trivial helper method for debug logging */ |
| 601 private void logd(String msg) { | 613 private static void logd(String msg) { |
| 602 Log.d(TAG, msg); | 614 Log.d(TAG, msg); |
| 603 } | 615 } |
| 604 | 616 |
| 605 /** Trivial helper method for error logging */ | 617 /** Trivial helper method for error logging */ |
| 606 private void loge(String msg) { | 618 private static void loge(String msg) { |
| 607 Log.e(TAG, msg); | 619 Log.e(TAG, msg); |
| 608 } | 620 } |
| 609 | 621 |
| 610 private class SettingsObserver extends ContentObserver { | 622 private class SettingsObserver extends ContentObserver { |
| 611 SettingsObserver() { | 623 SettingsObserver() { |
| 612 super(new Handler()); | 624 super(new Handler()); |
| 613 mContentResolver.registerContentObserver(Settings.System.CONTENT_URI
, true, this); | 625 mContentResolver.registerContentObserver(Settings.System.CONTENT_URI
, true, this); |
| 614 } | 626 } |
| 615 | 627 |
| 616 @Override | 628 @Override |
| (...skipping 19 matching lines...) Expand all Loading... |
| 636 synchronized (mSettingsObserverLock) { | 648 synchronized (mSettingsObserverLock) { |
| 637 mSettingsObserver = new SettingsObserver(); | 649 mSettingsObserver = new SettingsObserver(); |
| 638 mSettingsObserverLock.notify(); | 650 mSettingsObserverLock.notify(); |
| 639 } | 651 } |
| 640 | 652 |
| 641 // Listen for volume change. | 653 // Listen for volume change. |
| 642 Looper.loop(); | 654 Looper.loop(); |
| 643 } | 655 } |
| 644 } | 656 } |
| 645 } | 657 } |
| OLD | NEW |