Mise en file d'attente

Le framework Cast fournit des classes de mise en file d'attente compatibles avec la création de listes d'instances MediaQueueItem, qui peuvent être créées à partir d'instances MediaInfo telles que des flux vidéo ou audio, pour une lecture séquentielle sur le récepteur. Cette file d'attente d'éléments de contenu peut être modifiée, réorganisée, mise à jour, etc.

Le SDK du récepteur gère la file d'attente et répond aux opérations qu'elle effectue tant qu'au moins un élément de la file d'attente est actif (en cours de lecture ou en pause). Les expéditeurs peuvent rejoindre la session et ajouter des éléments à la file d'attente. Le récepteur conserve une session pour les éléments de la file d'attente jusqu'à ce que le dernier élément termine la lecture ou que l'expéditeur arrête la lecture et met fin à la session, ou jusqu'à ce qu'un expéditeur charge une nouvelle file d'attente sur le récepteur. Par défaut, le récepteur ne conserve aucune information sur les files d'attente arrêtées. Une fois le dernier élément de la file d'attente terminé, la session multimédia se termine et la file d'attente disparaît.

Créer et charger des éléments de file d'attente multimédia

Un élément de file d'attente multimédia est représenté dans le framework Cast sous la forme d'une instance MediaQueueItem. Lorsque vous créez un élément de file d'attente multimédia, si vous utilisez la bibliothèque de lecteurs multimédias avec du contenu adaptatif, vous pouvez définir le temps de préchargement afin que le lecteur puisse commencer à mettre en mémoire tampon l'élément de la file d'attente multimédia avant que l'élément qui le précède dans la file d'attente ne termine la lecture. Si l'attribut de lecture automatique de l'élément est défini sur "true", le destinataire peut le lire automatiquement. Par exemple, vous pouvez utiliser un modèle de compilateur pour créer votre élément de file d'attente multimédia comme suit:

Kotlin
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo)
    .setAutoplay(true)
    .setPreloadTime(20.0)
    .build()
Java
MediaQueueItem queueItem = new MediaQueueItem.Builder(mediaInfo)
  .setAutoplay(true)
  .setPreloadTime(20)
  .build();

Chargez un tableau d'éléments de file d'attente multimédia dans la file d'attente à l'aide de la méthode queueLoad appropriée de RemoteMediaClient.

Recevoir des informations sur l'état de la file d'attente multimédia

Lorsque le récepteur charge un élément de file d'attente multimédia, il attribue un ID unique à l'élément, qui est conservé pendant toute la durée de la session (et celle de la file d'attente). Votre application peut connaître l'état de la file d'attente en fonction de l'élément actuellement chargé (il peut ne pas être en cours de lecture), en cours de chargement ou préchargé. La classe MediaStatus fournit les informations suivantes sur l'état:

  • Méthode getPreloadedItemId() : si l'élément suivant a été préchargé, renvoie l'ID de l'élément préchargé.
  • Méthode getLoadingItemId() : renvoie l'ID de l'élément en cours de chargement (mais qui n'est pas actif dans la file d'attente) sur le récepteur.
  • Méthode getCurrentItemId() : renvoie l'ID de l'élément qui était actif dans la file d'attente (il se peut qu'il ne soit pas en cours de lecture) au moment du changement d'état du contenu multimédia.
  • Méthode getQueueItems() (obsolète, utilisez plutôt MediaQueue) : renvoie la liste des instances MediaQueueItem sous forme de liste non modifiable.

Votre application peut également obtenir la liste des éléments à l'aide de la classe MediaQueue. La classe est un modèle de données creux de la file d'attente multimédia. Elle conserve la liste des ID d'élément dans la file d'attente, qui est automatiquement synchronisée avec le destinataire. MediaQueue ne conserve pas l'ensemble des MediaQueueItem, car il consomme trop de mémoire lorsque la file d'attente est très longue. Au lieu de cela, il extrait les éléments à la demande et conserve un LruCache des éléments récemment consultés. Vous pouvez utiliser les méthodes suivantes pour accéder à la file d'attente multimédia:

  • Méthode getItemIds() : renvoie la liste de tous les ID d'articles dans l'ordre.
  • Méthode getItemAtIndex() : renvoie l'élément mis en cache pour un index donné. Si l'élément n'est pas mis en cache, MediaQueue renvoie null et planifie sa récupération. Lorsque l'élément est récupéré, MediaQueue.Callback#itemsUpdatedAtIndexes() est appelé, et un nouvel appel de getItemAtIndex() avec le même ID renvoie l'article.
  • fetchMoteItemsRelativeToIndex() est utilisé lorsque l'utilisateur fait défiler l'interface utilisateur de la file d'attente vers le haut ou le bas et que votre application souhaite récupérer plus d'éléments dans le cloud.

Utilisez ces méthodes avec les autres méthodes d'état du contenu multimédia pour informer votre application de l'état de la file d'attente et des éléments qu'elle contient. En plus des mises à jour de l'état des contenus multimédias du récepteur, votre application peut écouter les modifications apportées à la file d'attente en implémentant RemoteMediaClient.Callback et MediaQueue.Callback.

De plus, le SDK Cast fournit deux classes utilitaires pour créer une UI pour la mise en file d'attente.

Par exemple, pour créer un RecyclerView à l'aide de MediaQueueRecyclerViewAdapter:

Kotlin
class MyRecyclerViewAdapter(mediaQueue: MediaQueue?) :
    MediaQueueRecyclerViewAdapter<MyViewHolder?>(mediaQueue) {
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val item = getItem(position)

        // Update the view using `item`.
        ...
    }
}

class MyViewHolder : RecyclerView.ViewHolder {
    // Implement your own ViewHolder.
    ...
}

fun someMethod() {
    val adapter = MyRecyclerViewAdapter(
        mCastSession.remoteMediaClient.getMediaQueue())
    val recyclerView =
        activity.findViewById(R.id.my_recycler_view_id) as RecyclerView
    recyclerView.adapter = adapter
}
Java
public class MyRecyclerViewAdapter extends MediaQueueRecyclerViewAdapter<MyViewHolder> {
    public MyRecyclerViewAdapter(MediaQueue mediaQueue) {
        super(mediaQueue);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
      MediaQueueItem item = getItem(position);

      // Update the view using `item`.
      ...
    }
}

public class MyViewHolder implements RecyclerView.ViewHolder {
  // Implement your own ViewHolder.
  ...
}

public void someMethod() {
    RecyclerView.Adapter adapter = new MyRecyclerViewAdapter(
        mCastSession.getRemoteMediaClient().getMediaQueue());
    RecyclerView recyclerView =
        (RecyclerView) getActivity().findViewById(R.id.my_recycler_view_id);
    recyclerView.setAdapter(adapter);
}

Modifier la file d'attente

Pour effectuer des opérations sur les éléments de la file d'attente, utilisez les méthodes de file d'attente de la classe RemoteMediaClient. Ils vous permettent de charger un tableau d'éléments dans une nouvelle file d'attente, d'insérer des éléments dans une file d'attente existante, de mettre à jour les propriétés des éléments de la file d'attente, de faire avancer ou reculer un élément dans la file d'attente, de définir les propriétés de la file d'attente proprement dite (par exemple, modifier l'algorithme repeatMode qui sélectionne l'élément suivant), de supprimer des éléments de la file d'attente et de réorganiser les éléments de la file d'attente.