diff options
Diffstat (limited to 'media/java/android')
-rw-r--r-- | media/java/android/media/AudioService.java | 2 | ||||
-rw-r--r-- | media/java/android/media/Image.java | 5 | ||||
-rw-r--r-- | media/java/android/media/tv/TvInputService.java | 36 | ||||
-rwxr-xr-x | media/java/android/mtp/MtpDatabase.java | 68 | ||||
-rw-r--r-- | media/java/android/mtp/MtpPropertyGroup.java | 22 |
5 files changed, 84 insertions, 49 deletions
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 532314d..38a5b40 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -4714,7 +4714,7 @@ public class AudioService extends IAudioService.Stub { synchronized (mLastDeviceConnectMsgTime) { long time = SystemClock.uptimeMillis(); if (mLastDeviceConnectMsgTime > time) { - delay = (int)(mLastDeviceConnectMsgTime - time); + delay = (int)(mLastDeviceConnectMsgTime - time) + 30; } } } diff --git a/media/java/android/media/Image.java b/media/java/android/media/Image.java index 0d6b91a..53ab264 100644 --- a/media/java/android/media/Image.java +++ b/media/java/android/media/Image.java @@ -214,6 +214,11 @@ public abstract class Image implements AutoCloseable { * the underlying data could be mapped as a pointer in JNI without doing * any copies with {@code GetDirectBufferAddress}.</p> * + * <p>For raw formats, each plane is only guaranteed to contain data + * up to the last pixel in the last row. In other words, the stride + * after the last row may not be mapped into the buffer. This is a + * necessary requirement for any interleaved format.</p> + * * @return the byte buffer containing the image data for this plane. */ public abstract ByteBuffer getBuffer(); diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java index b19a1fb..b7e766b 100644 --- a/media/java/android/media/tv/TvInputService.java +++ b/media/java/android/media/tv/TvInputService.java @@ -310,7 +310,9 @@ public abstract class TvInputService extends Service { public void run() { try { if (DEBUG) Log.d(TAG, "notifySessionEvent(" + eventType + ")"); - mSessionCallback.onSessionEvent(eventType, eventArgs); + if (mSessionCallback != null) { + mSessionCallback.onSessionEvent(eventType, eventArgs); + } } catch (RemoteException e) { Log.w(TAG, "error in sending event (event=" + eventType + ")"); } @@ -329,7 +331,9 @@ public abstract class TvInputService extends Service { public void run() { try { if (DEBUG) Log.d(TAG, "notifyChannelRetuned"); - mSessionCallback.onChannelRetuned(channelUri); + if (mSessionCallback != null) { + mSessionCallback.onChannelRetuned(channelUri); + } } catch (RemoteException e) { Log.w(TAG, "error in notifyChannelRetuned"); } @@ -366,7 +370,9 @@ public abstract class TvInputService extends Service { public void run() { try { if (DEBUG) Log.d(TAG, "notifyTracksChanged"); - mSessionCallback.onTracksChanged(tracks); + if (mSessionCallback != null) { + mSessionCallback.onTracksChanged(tracks); + } } catch (RemoteException e) { Log.w(TAG, "error in notifyTracksChanged"); } @@ -394,7 +400,9 @@ public abstract class TvInputService extends Service { public void run() { try { if (DEBUG) Log.d(TAG, "notifyTrackSelected"); - mSessionCallback.onTrackSelected(type, trackId); + if (mSessionCallback != null) { + mSessionCallback.onTrackSelected(type, trackId); + } } catch (RemoteException e) { Log.w(TAG, "error in notifyTrackSelected"); } @@ -415,7 +423,9 @@ public abstract class TvInputService extends Service { public void run() { try { if (DEBUG) Log.d(TAG, "notifyVideoAvailable"); - mSessionCallback.onVideoAvailable(); + if (mSessionCallback != null) { + mSessionCallback.onVideoAvailable(); + } } catch (RemoteException e) { Log.w(TAG, "error in notifyVideoAvailable"); } @@ -447,7 +457,9 @@ public abstract class TvInputService extends Service { public void run() { try { if (DEBUG) Log.d(TAG, "notifyVideoUnavailable"); - mSessionCallback.onVideoUnavailable(reason); + if (mSessionCallback != null) { + mSessionCallback.onVideoUnavailable(reason); + } } catch (RemoteException e) { Log.w(TAG, "error in notifyVideoUnavailable"); } @@ -486,7 +498,9 @@ public abstract class TvInputService extends Service { public void run() { try { if (DEBUG) Log.d(TAG, "notifyContentAllowed"); - mSessionCallback.onContentAllowed(); + if (mSessionCallback != null) { + mSessionCallback.onContentAllowed(); + } } catch (RemoteException e) { Log.w(TAG, "error in notifyContentAllowed"); } @@ -526,7 +540,9 @@ public abstract class TvInputService extends Service { public void run() { try { if (DEBUG) Log.d(TAG, "notifyContentBlocked"); - mSessionCallback.onContentBlocked(rating.flattenToString()); + if (mSessionCallback != null) { + mSessionCallback.onContentBlocked(rating.flattenToString()); + } } catch (RemoteException e) { Log.w(TAG, "error in notifyContentBlocked"); } @@ -557,7 +573,9 @@ public abstract class TvInputService extends Service { try { if (DEBUG) Log.d(TAG, "layoutSurface (l=" + left + ", t=" + top + ", r=" + right + ", b=" + bottom + ",)"); - mSessionCallback.onLayoutSurface(left, top, right, bottom); + if (mSessionCallback != null) { + mSessionCallback.onLayoutSurface(left, top, right, bottom); + } } catch (RemoteException e) { Log.w(TAG, "error in layoutSurface"); } diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index 13cdc69..5d9355a 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -88,6 +88,10 @@ public class MtpDatabase { Files.FileColumns._ID, // 0 Files.FileColumns.DATA, // 1 }; + private static final String[] FORMAT_PROJECTION = new String[] { + Files.FileColumns._ID, // 0 + Files.FileColumns.FORMAT, // 1 + }; private static final String[] PATH_FORMAT_PROJECTION = new String[] { Files.FileColumns._ID, // 0 Files.FileColumns.DATA, // 1 @@ -597,6 +601,7 @@ public class MtpDatabase { MtpConstants.PROPERTY_PARENT_OBJECT, MtpConstants.PROPERTY_PERSISTENT_UID, MtpConstants.PROPERTY_NAME, + MtpConstants.PROPERTY_DISPLAY_NAME, MtpConstants.PROPERTY_DATE_ADDED, }; @@ -669,43 +674,6 @@ public class MtpDatabase { MtpConstants.PROPERTY_DESCRIPTION, }; - static final int[] ALL_PROPERTIES = { - // NOTE must match FILE_PROPERTIES above - MtpConstants.PROPERTY_STORAGE_ID, - MtpConstants.PROPERTY_OBJECT_FORMAT, - MtpConstants.PROPERTY_PROTECTION_STATUS, - MtpConstants.PROPERTY_OBJECT_SIZE, - MtpConstants.PROPERTY_OBJECT_FILE_NAME, - MtpConstants.PROPERTY_DATE_MODIFIED, - MtpConstants.PROPERTY_PARENT_OBJECT, - MtpConstants.PROPERTY_PERSISTENT_UID, - MtpConstants.PROPERTY_NAME, - MtpConstants.PROPERTY_DISPLAY_NAME, - MtpConstants.PROPERTY_DATE_ADDED, - - // image specific properties - MtpConstants.PROPERTY_DESCRIPTION, - - // audio specific properties - MtpConstants.PROPERTY_ARTIST, - MtpConstants.PROPERTY_ALBUM_NAME, - MtpConstants.PROPERTY_ALBUM_ARTIST, - MtpConstants.PROPERTY_TRACK, - MtpConstants.PROPERTY_ORIGINAL_RELEASE_DATE, - MtpConstants.PROPERTY_DURATION, - MtpConstants.PROPERTY_GENRE, - MtpConstants.PROPERTY_COMPOSER, - - // video specific properties - MtpConstants.PROPERTY_ARTIST, - MtpConstants.PROPERTY_ALBUM_NAME, - MtpConstants.PROPERTY_DURATION, - MtpConstants.PROPERTY_DESCRIPTION, - - // image specific properties - MtpConstants.PROPERTY_DESCRIPTION, - }; - private int[] getSupportedObjectProperties(int format) { switch (format) { case MtpConstants.FORMAT_MP3: @@ -723,8 +691,6 @@ public class MtpDatabase { case MtpConstants.FORMAT_PNG: case MtpConstants.FORMAT_BMP: return IMAGE_PROPERTIES; - case 0: - return ALL_PROPERTIES; default: return FILE_PROPERTIES; } @@ -749,6 +715,10 @@ public class MtpDatabase { MtpPropertyGroup propertyGroup; if (property == 0xFFFFFFFFL) { + if (format == 0 && handle > 0) { + // return properties based on the object's format + format = getObjectFormat((int)handle); + } propertyGroup = mPropertyGroupsByFormat.get(format); if (propertyGroup == null) { int[] propertyList = getSupportedObjectProperties(format); @@ -988,6 +958,26 @@ public class MtpDatabase { } } + private int getObjectFormat(int handle) { + Cursor c = null; + try { + c = mMediaProvider.query(mPackageName, mObjectsUri, FORMAT_PROJECTION, + ID_WHERE, new String[] { Integer.toString(handle) }, null, null); + if (c != null && c.moveToNext()) { + return c.getInt(1); + } else { + return -1; + } + } catch (RemoteException e) { + Log.e(TAG, "RemoteException in getObjectFilePath", e); + return -1; + } finally { + if (c != null) { + c.close(); + } + } + } + private int deleteFile(int handle) { mDatabaseModified = true; String path = null; diff --git a/media/java/android/mtp/MtpPropertyGroup.java b/media/java/android/mtp/MtpPropertyGroup.java index 781988d..c80adfa 100644 --- a/media/java/android/mtp/MtpPropertyGroup.java +++ b/media/java/android/mtp/MtpPropertyGroup.java @@ -172,6 +172,17 @@ class MtpPropertyGroup { column = Images.ImageColumns.DESCRIPTION; type = MtpConstants.TYPE_STR; break; + case MtpConstants.PROPERTY_AUDIO_WAVE_CODEC: + case MtpConstants.PROPERTY_AUDIO_BITRATE: + case MtpConstants.PROPERTY_SAMPLE_RATE: + // these are special cased + type = MtpConstants.TYPE_UINT32; + break; + case MtpConstants.PROPERTY_BITRATE_TYPE: + case MtpConstants.PROPERTY_NUMBER_OF_CHANNELS: + // these are special cased + type = MtpConstants.TYPE_UINT16; + break; default: type = MtpConstants.TYPE_UNDEFINED; Log.e(TAG, "unsupported property " + code); @@ -420,6 +431,17 @@ class MtpPropertyGroup { result.setResult(MtpConstants.RESPONSE_INVALID_OBJECT_HANDLE); } break; + case MtpConstants.PROPERTY_AUDIO_WAVE_CODEC: + case MtpConstants.PROPERTY_AUDIO_BITRATE: + case MtpConstants.PROPERTY_SAMPLE_RATE: + // we don't have these in our database, so return 0 + result.append(handle, propertyCode, MtpConstants.TYPE_UINT32, 0); + break; + case MtpConstants.PROPERTY_BITRATE_TYPE: + case MtpConstants.PROPERTY_NUMBER_OF_CHANNELS: + // we don't have these in our database, so return 0 + result.append(handle, propertyCode, MtpConstants.TYPE_UINT16, 0); + break; default: if (property.type == MtpConstants.TYPE_STR) { result.append(handle, propertyCode, c.getString(column)); |