Synchronize voice note queue reads and writes.

fork-5.53.8
Alex Hart 2020-11-17 14:42:01 -04:00 zatwierdzone przez GitHub
rodzic 907e8d93a3
commit 2290a6c0df
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
2 zmienionych plików z 50 dodań i 48 usunięć

Wyświetl plik

@ -140,56 +140,58 @@ final class VoiceNotePlaybackPreparer implements MediaSessionConnector.PlaybackP
} }
private void applyDescriptionsToQueue(@NonNull List<MediaDescriptionCompat> descriptions) { private void applyDescriptionsToQueue(@NonNull List<MediaDescriptionCompat> descriptions) {
for (MediaDescriptionCompat description : descriptions) { synchronized (queueDataAdapter) {
int holderIndex = queueDataAdapter.indexOf(description.getMediaUri()); for (MediaDescriptionCompat description : descriptions) {
MediaDescriptionCompat next = createNextClone(description); int holderIndex = queueDataAdapter.indexOf(description.getMediaUri());
int currentIndex = player.getCurrentWindowIndex(); MediaDescriptionCompat next = createNextClone(description);
int currentIndex = player.getCurrentWindowIndex();
if (holderIndex != -1) { if (holderIndex != -1) {
queueDataAdapter.remove(holderIndex);
if (!queueDataAdapter.isEmpty()) {
queueDataAdapter.remove(holderIndex); queueDataAdapter.remove(holderIndex);
}
queueDataAdapter.add(holderIndex, createNextClone(description)); if (!queueDataAdapter.isEmpty()) {
queueDataAdapter.add(holderIndex, description); queueDataAdapter.remove(holderIndex);
if (currentIndex != holderIndex) {
dataSource.removeMediaSource(holderIndex);
dataSource.addMediaSource(holderIndex, mediaSourceFactory.createMediaSource(description));
}
if (currentIndex != holderIndex + 1) {
if (dataSource.getSize() > 1) {
dataSource.removeMediaSource(holderIndex + 1);
} }
dataSource.addMediaSource(holderIndex + 1, mediaSourceFactory.createMediaSource(next)); queueDataAdapter.add(holderIndex, createNextClone(description));
queueDataAdapter.add(holderIndex, description);
if (currentIndex != holderIndex) {
dataSource.removeMediaSource(holderIndex);
dataSource.addMediaSource(holderIndex, mediaSourceFactory.createMediaSource(description));
}
if (currentIndex != holderIndex + 1) {
if (dataSource.getSize() > 1) {
dataSource.removeMediaSource(holderIndex + 1);
}
dataSource.addMediaSource(holderIndex + 1, mediaSourceFactory.createMediaSource(next));
}
} else {
int insertLocation = queueDataAdapter.indexAfter(description);
queueDataAdapter.add(insertLocation, next);
queueDataAdapter.add(insertLocation, description);
dataSource.addMediaSource(insertLocation, mediaSourceFactory.createMediaSource(next));
dataSource.addMediaSource(insertLocation, mediaSourceFactory.createMediaSource(description));
} }
} else {
int insertLocation = queueDataAdapter.indexAfter(description);
queueDataAdapter.add(insertLocation, next);
queueDataAdapter.add(insertLocation, description);
dataSource.addMediaSource(insertLocation, mediaSourceFactory.createMediaSource(next));
dataSource.addMediaSource(insertLocation, mediaSourceFactory.createMediaSource(description));
} }
}
int lastIndex = queueDataAdapter.size() - 1; int lastIndex = queueDataAdapter.size() - 1;
MediaDescriptionCompat last = queueDataAdapter.getMediaDescription(lastIndex); MediaDescriptionCompat last = queueDataAdapter.getMediaDescription(lastIndex);
if (Objects.equals(last.getMediaUri(), NEXT_URI)) { if (Objects.equals(last.getMediaUri(), NEXT_URI)) {
queueDataAdapter.remove(lastIndex); queueDataAdapter.remove(lastIndex);
dataSource.removeMediaSource(lastIndex); dataSource.removeMediaSource(lastIndex);
if (queueDataAdapter.size() > 1) { if (queueDataAdapter.size() > 1) {
MediaDescriptionCompat end = createEndClone(last); MediaDescriptionCompat end = createEndClone(last);
queueDataAdapter.add(lastIndex, end); queueDataAdapter.add(lastIndex, end);
dataSource.addMediaSource(lastIndex, mediaSourceFactory.createMediaSource(end)); dataSource.addMediaSource(lastIndex, mediaSourceFactory.createMediaSource(end));
}
} }
} }
} }

Wyświetl plik

@ -20,31 +20,31 @@ final class VoiceNoteQueueDataAdapter implements TimelineQueueEditor.QueueDataAd
private final List<MediaDescriptionCompat> descriptions = new LinkedList<>(); private final List<MediaDescriptionCompat> descriptions = new LinkedList<>();
@Override @Override
public MediaDescriptionCompat getMediaDescription(int position) { public synchronized MediaDescriptionCompat getMediaDescription(int position) {
return descriptions.get(position); return descriptions.get(position);
} }
@Override @Override
public void add(int position, MediaDescriptionCompat description) { public synchronized void add(int position, MediaDescriptionCompat description) {
descriptions.add(position, description); descriptions.add(position, description);
} }
@Override @Override
public void remove(int position) { public synchronized void remove(int position) {
descriptions.remove(position); descriptions.remove(position);
} }
@Override @Override
public void move(int from, int to) { public synchronized void move(int from, int to) {
MediaDescriptionCompat description = descriptions.remove(from); MediaDescriptionCompat description = descriptions.remove(from);
descriptions.add(to, description); descriptions.add(to, description);
} }
int size() { synchronized int size() {
return descriptions.size(); return descriptions.size();
} }
int indexOf(@NonNull Uri uri) { synchronized int indexOf(@NonNull Uri uri) {
for (int i = 0; i < descriptions.size(); i++) { for (int i = 0; i < descriptions.size(); i++) {
if (Objects.equals(uri, descriptions.get(i).getMediaUri())) { if (Objects.equals(uri, descriptions.get(i).getMediaUri())) {
return i; return i;
@ -54,7 +54,7 @@ final class VoiceNoteQueueDataAdapter implements TimelineQueueEditor.QueueDataAd
return -1; return -1;
} }
int indexAfter(@NonNull MediaDescriptionCompat target) { synchronized int indexAfter(@NonNull MediaDescriptionCompat target) {
if (isEmpty()) { if (isEmpty()) {
return 0; return 0;
} }
@ -71,11 +71,11 @@ final class VoiceNoteQueueDataAdapter implements TimelineQueueEditor.QueueDataAd
return descriptions.size(); return descriptions.size();
} }
boolean isEmpty() { synchronized boolean isEmpty() {
return descriptions.isEmpty(); return descriptions.isEmpty();
} }
void clear() { synchronized void clear() {
descriptions.clear(); descriptions.clear();
} }
} }