diff options
author | Prabhakaran Mc <prabhakaranmc@codeaurora.org> | 2011-04-26 11:58:00 +0530 |
---|---|---|
committer | Chris Boyle <chris@boyle.name> | 2012-03-30 22:34:55 +0100 |
commit | 0148fc9a776f2da78d6321bf245e42de9b5bd417 (patch) | |
tree | 9dd3dae92347cb3f40f16d1e1cdb303f99c22744 /core/jni/android_server_BluetoothA2dpService.cpp | |
parent | 40c519edc38563a1017596d8559d5f8efd765cf6 (diff) | |
download | frameworks_base-0148fc9a776f2da78d6321bf245e42de9b5bd417.zip frameworks_base-0148fc9a776f2da78d6321bf245e42de9b5bd417.tar.gz frameworks_base-0148fc9a776f2da78d6321bf245e42de9b5bd417.tar.bz2 |
frameworks/base: bluetooth: AVRCP 1.3 feature changes
Bluetooth module will listen metadata/event change intents
from Music app and post data to Bluez stack.
Modified by Chris Boyle: removed PLAYSTATUS_REQUEST/RESPONSE.
See http://review.cyanogenmod.com/14001
Conflicts:
core/java/android/server/BluetoothA2dpService.java
core/jni/android_server_BluetoothEventLoop.cpp
Gingerbread change Icbfb1712dde98c9677f57c869bcfffed2bb42a14
Change-Id: Id8cbec68302b53befbec4273013668a58c755369
Diffstat (limited to 'core/jni/android_server_BluetoothA2dpService.cpp')
-rw-r--r-- | core/jni/android_server_BluetoothA2dpService.cpp | 123 |
1 files changed, 122 insertions, 1 deletions
diff --git a/core/jni/android_server_BluetoothA2dpService.cpp b/core/jni/android_server_BluetoothA2dpService.cpp index 1851ad6..51d25c0 100644 --- a/core/jni/android_server_BluetoothA2dpService.cpp +++ b/core/jni/android_server_BluetoothA2dpService.cpp @@ -39,6 +39,13 @@ namespace android { #ifdef HAVE_BLUETOOTH static jmethodID method_onSinkPropertyChanged; static jmethodID method_onConnectSinkResult; +static jmethodID method_onGetPlayStatusRequest; +static jfieldID field_mTrackName; +static jfieldID field_mArtistName; +static jfieldID field_mAlbumName; +static jfieldID field_mMediaNumber; +static jfieldID field_mMediaCount; +static jfieldID field_mDuration; typedef struct { JavaVM *vm; @@ -49,6 +56,7 @@ typedef struct { static native_data_t *nat = NULL; // global native data static void onConnectSinkResult(DBusMessage *msg, void *user, void *n); +static void onStatusReply(DBusMessage *msg, void *user, void *n); static Properties sink_properties[] = { {"State", DBUS_TYPE_STRING}, @@ -216,6 +224,92 @@ static jboolean avrcpVolumeUpNative(JNIEnv *env, jobject object, return JNI_FALSE; } +static jboolean sendMetaDataNative(JNIEnv *env, jobject obj, + jstring path) { +#ifdef HAVE_BLUETOOTH + LOGV(__FUNCTION__); + if (nat) { + jstring title, artist, album, media_number, total_media_count, playing_time; + const char *c_title, *c_artist, *c_album, *c_media_number; + const char *c_total_media_count, *c_playing_time; + const char *c_path = env->GetStringUTFChars(path, NULL); + title = (jstring) env->GetObjectField(obj, field_mTrackName); + artist = (jstring) env->GetObjectField(obj, field_mArtistName); + album = (jstring) env->GetObjectField(obj, field_mAlbumName); + media_number = (jstring) env->GetObjectField(obj, field_mMediaNumber); + total_media_count = (jstring) env->GetObjectField(obj, field_mMediaCount); + playing_time = (jstring) env->GetObjectField(obj, field_mDuration); + + c_title = env->GetStringUTFChars(title, NULL); + c_artist = env->GetStringUTFChars(artist, NULL); + c_album = env->GetStringUTFChars(album, NULL); + c_media_number = env->GetStringUTFChars(media_number, NULL); + c_total_media_count = env->GetStringUTFChars(total_media_count, NULL); + c_playing_time = env->GetStringUTFChars(playing_time, NULL); + + bool ret = dbus_func_args_async(env, nat->conn, -1, onStatusReply, NULL, nat, + c_path, "org.bluez.Control", "UpdateMetaData", + DBUS_TYPE_STRING, &c_title, + DBUS_TYPE_STRING, &c_artist, + DBUS_TYPE_STRING, &c_album, + DBUS_TYPE_STRING, &c_media_number, + DBUS_TYPE_STRING, &c_total_media_count, + DBUS_TYPE_STRING, &c_playing_time, + DBUS_TYPE_INVALID); + + env->ReleaseStringUTFChars(path, c_path); + env->ReleaseStringUTFChars(title, c_title); + env->ReleaseStringUTFChars(artist, c_artist); + env->ReleaseStringUTFChars(album, c_album); + env->ReleaseStringUTFChars(media_number, c_media_number); + env->ReleaseStringUTFChars(total_media_count, c_total_media_count); + env->ReleaseStringUTFChars(playing_time, c_playing_time); + + return ret ? JNI_TRUE : JNI_FALSE; + } +#endif + return JNI_FALSE; +} + + +static jboolean sendPlayStatusNative(JNIEnv *env, jobject object, jstring path, + jint duration, jint position, jint play_status) { +#ifdef HAVE_BLUETOOTH + LOGV(__FUNCTION__); + if (nat) { + const char *c_path = env->GetStringUTFChars(path, NULL); + bool ret = dbus_func_args_async(env, nat->conn, -1, onStatusReply, NULL, nat, + c_path, "org.bluez.Control", "UpdatePlayStatus", + DBUS_TYPE_UINT32, &duration, + DBUS_TYPE_UINT32, &position, + DBUS_TYPE_UINT32, &play_status, + DBUS_TYPE_INVALID); + env->ReleaseStringUTFChars(path, c_path); + return ret ? JNI_TRUE : JNI_FALSE; + } +#endif + return JNI_FALSE; +} + +static jboolean sendEventNative(JNIEnv *env, jobject object, + jstring path, jint event_id, jlong data) { +#ifdef HAVE_BLUETOOTH + LOGV(__FUNCTION__); + if (nat) { + const char *c_path = env->GetStringUTFChars(path, NULL); + + bool ret = dbus_func_args_async(env, nat->conn, -1, onStatusReply, NULL, nat, + c_path, "org.bluez.Control", "UpdateNotification", + DBUS_TYPE_UINT16, &event_id, + DBUS_TYPE_UINT64, &data, + DBUS_TYPE_INVALID); + env->ReleaseStringUTFChars(path, c_path); + return ret ? JNI_TRUE : JNI_FALSE; + } +#endif + return JNI_FALSE; +} + static jboolean avrcpVolumeDownNative(JNIEnv *env, jobject object, jstring path) { #ifdef HAVE_BLUETOOTH @@ -264,7 +358,12 @@ DBusHandlerResult a2dp_event_filter(DBusMessage *msg, JNIEnv *env) { env->DeleteLocalRef(path); result = DBUS_HANDLER_RESULT_HANDLED; return result; - } else { + } else if (dbus_message_is_signal(msg, "org.bluez.Control", + "GetPlayStatus")) { + env->CallVoidMethod(nat->me, method_onGetPlayStatusRequest); + result = DBUS_HANDLER_RESULT_HANDLED; + return result; + }else { LOGV("... ignored"); } if (env->ExceptionCheck()) { @@ -304,6 +403,17 @@ void onConnectSinkResult(DBusMessage *msg, void *user, void *n) { free(user); } +void onStatusReply(DBusMessage *msg, void *user, void *n) { + LOGV(__FUNCTION__); + + native_data_t *nat = (native_data_t *)n; + DBusError err; + dbus_error_init(&err); + if (dbus_set_error_from_message(&err, msg)) { + LOG_AND_FREE_DBUS_ERROR(&err); + } +} + #endif @@ -321,6 +431,9 @@ static JNINativeMethod sMethods[] = { (void *)getSinkPropertiesNative}, {"avrcpVolumeUpNative", "(Ljava/lang/String;)Z", (void*)avrcpVolumeUpNative}, {"avrcpVolumeDownNative", "(Ljava/lang/String;)Z", (void*)avrcpVolumeDownNative}, + {"sendMetaDataNative", "(Ljava/lang/String;)Z", (void*)sendMetaDataNative}, + {"sendEventNative", "(Ljava/lang/String;IJ)Z", (void*)sendEventNative}, + {"sendPlayStatusNative", "(Ljava/lang/String;III)Z", (void*)sendPlayStatusNative}, }; int register_android_server_BluetoothA2dpService(JNIEnv *env) { @@ -335,6 +448,14 @@ int register_android_server_BluetoothA2dpService(JNIEnv *env) { "(Ljava/lang/String;[Ljava/lang/String;)V"); method_onConnectSinkResult = env->GetMethodID(clazz, "onConnectSinkResult", "(Ljava/lang/String;Z)V"); + method_onGetPlayStatusRequest = env->GetMethodID(clazz, "onGetPlayStatusRequest", + "()V"); + field_mTrackName = env->GetFieldID(clazz, "mTrackName", "Ljava/lang/String;"); + field_mArtistName = env->GetFieldID(clazz, "mArtistName", "Ljava/lang/String;"); + field_mAlbumName = env->GetFieldID(clazz, "mAlbumName", "Ljava/lang/String;"); + field_mMediaNumber = env->GetFieldID(clazz, "mMediaNumber", "Ljava/lang/String;"); + field_mMediaCount = env->GetFieldID(clazz, "mMediaCount", "Ljava/lang/String;"); + field_mDuration = env->GetFieldID(clazz, "mDuration", "Ljava/lang/String;"); #endif return AndroidRuntime::registerNativeMethods(env, |