Skip to content
This repository has been archived by the owner on Dec 24, 2024. It is now read-only.

Commit

Permalink
Revert "FIX: [shield] properly handle wifi direct headset"
Browse files Browse the repository at this point in the history
This reverts commit eb55eb2.

Shield is crashing (see logcat) below. Probable race between doing audioManager.getDevices and HDMI being reset due to refresh rate change.

08-13 21:13:31.088  1322  1322 F art     : art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: negative array length: -2080078848
08-13 21:13:31.088  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]     in call to NewPrimitiveArray
08-13 21:13:31.088  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]     from int android.media.AudioSystem.listAudioPorts(java.util.ArrayList, int[])
08-13 21:13:31.088  1322  1322 F art     : art/runtime/java_vm_ext.cc:410] "main" prio=5 tid=1 Runnable
08-13 21:13:31.088  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   | group="main" sCount=0 dsCount=0 obj=0x74bb3fa0 self=0x42c4a500
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   | sysTid=1322 nice=0 cgrp=default sched=0/0 handle=0x40551b5c
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   | state=R schedstat=( 58361090530 15899081778 811787 ) utm=3474 stm=2362 core=1 HZ=100
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   | stack=0xff31a000-0xff31c000 stackSize=8MB
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   | held mutexes= "mutator lock"(shared held)
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   native: #00 pc 00370aa9  /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiPKcPNS_9ArtMethodEPv+160)
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   native: #1 pc 003503b7  /system/lib/libart.so (_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+150)
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   native: #2 pc 0025a6fd  /system/lib/libart.so (_ZN3art9JavaVMExt8JniAbortEPKcS2_+740)
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   native: #3 pc 0025ae53  /system/lib/libart.so (_ZN3art9JavaVMExt9JniAbortFEPKcS2_z+74)
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   native: #4 pc 002a0a99  /system/lib/libart.so (_ZN3art3JNI11NewIntArrayEP7_JNIEnvi+456)
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   native: #5 pc 0009be8f  /system/lib/libandroid_runtime.so (???)
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   native: #6 pc 0021f8c5  /system/framework/arm/boot.oat (Java_android_media_AudioSystem_listAudioPorts__Ljava_util_ArrayList_2_3I+112)
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   at android.media.AudioSystem.listAudioPorts(Native method)
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   at android.media.AudioManager.updateAudioPortCache(AudioManager.java:3612)
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   - locked <0x037ede83> (a java.lang.Integer)
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   at android.media.AudioPortEventHandler$1.handleMessage(AudioPortEventHandler.java:87)
08-13 21:13:31.089  1322  1322 F art     : art/runtime/java_vm_ext.cc:410]   at android.os.Handler.dispatchMessage(Handler.java:104)
  • Loading branch information
koying committed Aug 14, 2016
1 parent 7152d3a commit ead9846
Show file tree
Hide file tree
Showing 13 changed files with 20 additions and 408 deletions.
25 changes: 0 additions & 25 deletions tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
package @APP_PACKAGE@;

import android.os.Build.VERSION_CODES;
import android.os.Build;
import android.app.NativeActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.media.AudioDeviceCallback;
import android.media.AudioDeviceInfo;
import android.media.AudioManager;
import android.os.Bundle;
import android.util.Log;
Expand Down Expand Up @@ -36,23 +32,6 @@ public class Main extends NativeActivity implements Choreographer.FrameCallback
native void _onNewIntent(Intent intent);
native void _onActivityResult(int requestCode, int resultCode, Intent resultData);
native void _doFrame(long frameTimeNanos);
native void _onAudioDeviceAdded(AudioDeviceInfo[] addedDevices);
native void _onAudioDeviceRemoved(AudioDeviceInfo[] removedDevices);

private class MyAudioDeviceCallback extends AudioDeviceCallback
{
public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices)
{
if (addedDevices.length != 0)
_onAudioDeviceAdded(addedDevices);
}

public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices)
{
if (removedDevices.length != 0)
_onAudioDeviceRemoved(removedDevices);
}
}

private Runnable leanbackUpdateRunnable = new Runnable()
{
Expand Down Expand Up @@ -152,10 +131,6 @@ public class Main extends NativeActivity implements Choreographer.FrameCallback
mSettingsContentObserver = new XBMCSettingsContentObserver(this, handler);
getApplicationContext().getContentResolver().registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mSettingsContentObserver );

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
AudioManager audioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
audioManager.registerAudioDeviceCallback(new MyAudioDeviceCallback(), null);
}
mJsonRPC = new XBMCJsonRPC();

// Delayed Intent
Expand Down
20 changes: 2 additions & 18 deletions xbmc/android/activity/JNIMainActivity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@

#include "JNIMainActivity.h"

#include "android/jni/Activity.h"
#include "android/jni/Intent.h"
#include "android/jni/jutils/jutils-details.hpp"

using namespace jni;
Expand Down Expand Up @@ -60,24 +62,6 @@ void CJNIMainActivity::_callNative(JNIEnv *env, jobject context, jlong funcAddr,
((void (*)(CVariant *))funcAddr)((CVariant *)variantAddr);
}

void CJNIMainActivity::_onAudioDeviceAdded(JNIEnv *env, jobject context, jobjectArray devices)
{
(void)env;
(void)context;
if (m_appInstance)
{
m_appInstance->onAudioDeviceAdded(jcast<CJNIAudioDeviceInfos>(jhobjectArray(devices)));
}
}

void CJNIMainActivity::_onAudioDeviceRemoved(JNIEnv *env, jobject context, jobjectArray devices)
{
(void)env;
(void)context;
if (m_appInstance)
m_appInstance->onAudioDeviceRemoved(jcast<CJNIAudioDeviceInfos>(jhobjectArray(devices)));
}

void CJNIMainActivity::runNativeOnUiThread(void (*callback)(CVariant *), CVariant* variant)
{
call_method<void>(m_context,
Expand Down
6 changes: 0 additions & 6 deletions xbmc/android/activity/JNIMainActivity.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@

#include "android/jni/Activity.h"
#include "android/jni/Surface.h"
#include "android/jni/Intent.h"
#include "android/jni/AudioDeviceInfo.h"

class CJNIMainActivity : public CJNIActivity
{
Expand All @@ -37,8 +35,6 @@ class CJNIMainActivity : public CJNIActivity
static void _onVolumeChanged(JNIEnv *env, jobject context, jint volume);
static void _onAudioFocusChange(JNIEnv *env, jobject context, jint focusChange);
static void _doFrame(JNIEnv *env, jobject context, jlong frameTimeNanos);
static void _onAudioDeviceAdded(JNIEnv *env, jobject context, jobjectArray devices);
static void _onAudioDeviceRemoved(JNIEnv *env, jobject context, jobjectArray devices);

static void _callNative(JNIEnv *env, jobject context, jlong funcAddr, jlong variantAddr);
static void runNativeOnUiThread(void (*callback)(CVariant *), CVariant *variant);
Expand All @@ -59,6 +55,4 @@ class CJNIMainActivity : public CJNIActivity
virtual void onVolumeChanged(int volume)=0;
virtual void onAudioFocusChange(int focusChange)=0;
virtual void doFrame(int64_t frameTimeNanos)=0;
virtual void onAudioDeviceAdded(CJNIAudioDeviceInfos devices)=0;
virtual void onAudioDeviceRemoved(CJNIAudioDeviceInfos devices)=0;
};
51 changes: 13 additions & 38 deletions xbmc/android/activity/XBMCApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,8 @@ void CXBMCApp::onResume()
else
g_application.WakeUpScreenSaverAndDPMS();

CheckHeadsetPlugged();
CJNIAudioManager audioManager(getSystemService("audio"));
m_headsetPlugged = audioManager.isWiredHeadsetOn() || audioManager.isBluetoothA2dpOn();

unregisterMediaButtonEventReceiver();

Expand Down Expand Up @@ -412,32 +413,6 @@ bool CXBMCApp::ReleaseAudioFocus()
return true;
}

void CXBMCApp::CheckHeadsetPlugged()
{
bool oldstate = m_headsetPlugged;

CJNIAudioManager audioManager(getSystemService("audio"));
m_headsetPlugged = audioManager.isWiredHeadsetOn() || audioManager.isBluetoothA2dpOn();

if (CJNIAudioManager::GetSDKVersion() >= 23)
{
CJNIAudioDeviceInfos devices = audioManager.getDevices(CJNIAudioManager::GET_DEVICES_OUTPUTS);

for (auto dev : devices)
{
if (StringUtils::CompareNoCase(dev.getProductName().toString(), "SHIELD Android TV") == 0 && dev.getType() == CJNIAudioDeviceInfo::TYPE_DOCK)
{
// SHIELD specifics: Gamepad headphone is inserted
m_headsetPlugged = true;
CLog::Log(LOGINFO, "SHIELD: Wifi direct headset inserted");
}
}
}

if (m_headsetPlugged != oldstate)
CAEFactory::DeviceChange();
}

bool CXBMCApp::IsHeadsetPlugged()
{
return m_headsetPlugged;
Expand Down Expand Up @@ -812,7 +787,17 @@ void CXBMCApp::onReceive(CJNIIntent intent)
}
else if (action == "android.intent.action.HEADSET_PLUG" || action == "android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED")
{
CheckHeadsetPlugged();
bool newstate;
if (action == "android.intent.action.HEADSET_PLUG")
newstate = (intent.getIntExtra("state", 0) != 0);
else
newstate = (intent.getIntExtra("android.bluetooth.profile.extra.STATE", 0) == 2 /* STATE_CONNECTED */);

if (newstate != m_headsetPlugged)
{
m_headsetPlugged = newstate;
CAEFactory::DeviceChange();
}
}
else if (action == "android.intent.action.MEDIA_BUTTON")
{
Expand Down Expand Up @@ -896,16 +881,6 @@ void CXBMCApp::onActivityResult(int requestCode, int resultCode, CJNIIntent resu
}
}

void CXBMCApp::onAudioDeviceAdded(CJNIAudioDeviceInfos devices)
{
CheckHeadsetPlugged();
}

void CXBMCApp::onAudioDeviceRemoved(CJNIAudioDeviceInfos devices)
{
CheckHeadsetPlugged();
}

int CXBMCApp::WaitForActivityResult(const CJNIIntent &intent, int requestCode, CJNIIntent &result)
{
int ret = 0;
Expand Down
4 changes: 0 additions & 4 deletions xbmc/android/activity/XBMCApp.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
#include "android/jni/Activity.h"
#include "android/jni/BroadcastReceiver.h"
#include "android/jni/AudioManager.h"
#include "android/jni/AudioDeviceInfo.h"
#include "threads/Event.h"
#include "interfaces/IAnnouncer.h"

Expand Down Expand Up @@ -104,8 +103,6 @@ class CXBMCApp
virtual void onVolumeChanged(int volume);
virtual void onAudioFocusChange(int focusChange);
virtual void doFrame(int64_t frameTimeNanos);
virtual void onAudioDeviceAdded(CJNIAudioDeviceInfos devices);
virtual void onAudioDeviceRemoved(CJNIAudioDeviceInfos devices);

bool isValid() { return m_activity != NULL; }

Expand Down Expand Up @@ -136,7 +133,6 @@ class CXBMCApp
static bool EnableWakeLock(bool on);
static bool HasFocus() { return m_hasFocus; }
static bool IsResumed() { return m_isResumed; }
static void CheckHeadsetPlugged();
static bool IsHeadsetPlugged();

static bool StartActivity(const std::string &package, const std::string &intent = std::string(), const std::string &dataType = std::string(), const std::string &dataURI = std::string());
Expand Down
14 changes: 0 additions & 14 deletions xbmc/android/activity/android_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,20 +127,6 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
(void*)&CJNIMainActivity::_callNative
};
env->RegisterNatives(cMain, &mCallNative, 1);

JNINativeMethod mAudioDeviceAdded = {
"_onAudioDeviceAdded",
"([Landroid/media/AudioDeviceInfo;)V",
(void*)&CJNIMainActivity::_onAudioDeviceAdded
};
env->RegisterNatives(cMain, &mAudioDeviceAdded, 1);

JNINativeMethod mAudioDeviceRemoved = {
"_onAudioDeviceRemoved",
"([Landroid/media/AudioDeviceInfo;)V",
(void*)&CJNIMainActivity::_onAudioDeviceRemoved
};
env->RegisterNatives(cMain, &mAudioDeviceRemoved, 1);
}

jclass cBroadcastReceiver = env->FindClass(bcReceiver.c_str());
Expand Down
153 changes: 0 additions & 153 deletions xbmc/android/jni/AudioDeviceInfo.cpp

This file was deleted.

Loading

0 comments on commit ead9846

Please sign in to comment.