Bug 796300 - Final version: Set audio device BLUETOOTH_SCO_HEADSET to unavailable when disconnect Sco socket, r=qdot

This commit is contained in:
Gina Yeh 2012-10-03 10:55:28 +08:00
parent 859bce8726
commit 78c37a4bca
4 changed files with 36 additions and 12 deletions

View File

@ -16,6 +16,7 @@
#include "mozilla/dom/bluetooth/BluetoothTypes.h"
#include "mozilla/Services.h"
#include "nsContentUtils.h"
#include "nsIAudioManager.h"
#include "nsIObserverService.h"
#include "nsIRadioInterfaceLayer.h"
#include "nsISystemMessagesInternal.h"
@ -26,6 +27,7 @@
#include <unistd.h> /* usleep() */
#define MOZSETTINGS_CHANGED_ID "mozsettings-changed"
#define BLUETOOTH_SCO_STATUS_CHANGED "bluetooth-sco-status-changed"
#define AUDIO_VOLUME_MASTER "audio.volume.master"
USING_BLUETOOTH_NAMESPACE
@ -82,14 +84,29 @@ CloseScoSocket()
{
MOZ_ASSERT(NS_IsMainThread());
nsCOMPtr<nsIAudioManager> am = do_GetService("@mozilla.org/telephony/audiomanager;1");
if (!am) {
NS_WARNING("Failed to get AudioManager Service!");
return;
}
am->SetForceForUse(am->USE_COMMUNICATION, am->FORCE_NONE);
BluetoothScoManager* sco = BluetoothScoManager::Get();
if (!sco) {
NS_WARNING("BluetoothScoManager is not available!");
return;
}
if (sco->GetConnected())
if (sco->GetConnected()) {
nsCOMPtr<nsIObserverService> obs = do_GetService("@mozilla.org/observer-service;1");
if (obs) {
if (NS_FAILED(obs->NotifyObservers(nullptr, BLUETOOTH_SCO_STATUS_CHANGED, nullptr))) {
NS_WARNING("Failed to notify bluetooth-sco-status-changed observsers!");
return;
}
}
sco->Disconnect();
}
}
BluetoothHfpManager::BluetoothHfpManager()

View File

@ -190,6 +190,9 @@ public:
MOZ_ASSERT(NS_IsMainThread());
nsCOMPtr<nsIAudioManager> am = do_GetService("@mozilla.org/telephony/audiomanager;1");
if (!am) {
NS_WARNING("Failed to get AudioManager service!");
}
am->SetForceForUse(am->USE_COMMUNICATION, am->FORCE_BT_SCO);
nsCOMPtr<nsIObserverService> obs = do_GetService("@mozilla.org/observer-service;1");

View File

@ -36,7 +36,6 @@ using namespace mozilla;
// A bitwise variable for recording what kind of headset is attached.
static int sHeadsetState;
static const char* sDeviceAddress;
static int kBtSampleRate = 8000;
static bool
@ -80,10 +79,6 @@ InternalSetAudioRoutesICS(SwitchState aState)
AudioSystem::setDeviceConnectionState(AUDIO_DEVICE_OUT_WIRED_HEADPHONE,
AUDIO_POLICY_DEVICE_STATE_AVAILABLE, "");
sHeadsetState |= AUDIO_DEVICE_OUT_WIRED_HEADPHONE;
} else if (aState == SWITCH_STATE_BLUETOOTH_SCO) {
AudioSystem::setDeviceConnectionState(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET,
AUDIO_POLICY_DEVICE_STATE_AVAILABLE, sDeviceAddress);
sHeadsetState |= AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET;
} else if (aState == SWITCH_STATE_OFF) {
AudioSystem::setDeviceConnectionState(static_cast<audio_devices_t>(sHeadsetState),
AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE, "");
@ -135,12 +130,22 @@ AudioManager::Observe(nsISupports* aSubject,
const PRUnichar* aData)
{
if (!strcmp(aTopic, BLUETOOTH_SCO_STATUS_CHANGED)) {
String8 cmd;
cmd.appendFormat("bt_samplerate=%d", kBtSampleRate);
AudioSystem::setParameters(0, cmd);
if (aData) {
String8 cmd;
cmd.appendFormat("bt_samplerate=%d", kBtSampleRate);
AudioSystem::setParameters(0, cmd);
const char* address = NS_ConvertUTF16toUTF8(nsDependentString(aData)).get();
AudioSystem::setDeviceConnectionState(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET,
AUDIO_POLICY_DEVICE_STATE_AVAILABLE, address);
AudioSystem::setDeviceConnectionState(AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET,
AUDIO_POLICY_DEVICE_STATE_AVAILABLE, address);
} else {
AudioSystem::setDeviceConnectionState(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET,
AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE, "");
AudioSystem::setDeviceConnectionState(AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET,
AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE, "");
}
sDeviceAddress = NS_ConvertUTF16toUTF8(nsDependentString(aData)).get();
InternalSetAudioRoutes(SwitchState::SWITCH_STATE_BLUETOOTH_SCO);
return NS_OK;
}
return NS_ERROR_UNEXPECTED;

View File

@ -62,7 +62,6 @@ enum SwitchState {
SWITCH_STATE_OFF,
SWITCH_STATE_HEADSET, // Headphone with microphone
SWITCH_STATE_HEADPHONE, // without microphone
SWITCH_STATE_BLUETOOTH_SCO,
NUM_SWITCH_STATE
};