Enfileiramento

O framework do Cast oferece classes de enfileiramento que permitem criar listas de instâncias de MediaQueueItem que podem ser criadas com instâncias de MediaInfo, como streams de vídeo ou áudio, para serem reproduzidas sequencialmente no receptor. Essa fila de itens de conteúdo pode ser editada, reordenada, atualizada e assim por diante.

O SDK do receptor mantém a fila e responde às operações nela enquanto houver pelo menos um item ativo (em reprodução ou pausado). Os remetentes podem participar da sessão e adicionar itens à fila. O receptor mantém uma sessão para itens da fila até que o último item conclua a reprodução ou o remetente pare a reprodução e encerre a sessão, ou até que um remetente carregue uma nova fila no receptor. Por padrão, o receptor não mantém nenhuma informação sobre filas encerradas. Quando o último item da fila terminar, a sessão de mídia será encerrada e a fila vai desaparecer.

Criar e carregar itens da fila de mídia

Um item da fila de mídia é representado no framework Cast como uma instância MediaQueueItem. Ao criar um item de fila de mídia, se você estiver usando a Biblioteca do Media Player com conteúdo adaptável, defina o tempo de pré-carregamento para que o player possa começar a armazenar em buffer o item da fila de mídia antes que o item anterior na fila termine de ser reproduzido. Definir o atributo de reprodução automática do item como verdadeiro permite que o receptor o reproduza automaticamente. Por exemplo, use um padrão de builder para criar seu item da fila de mídia da seguinte forma:

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();

Carregue uma matriz de itens da fila de mídia usando o método queueLoad adequado de RemoteMediaClient.

Receber atualizações de status da fila de mídia

Quando o receptor carrega um item da fila de mídia, ele atribui um ID exclusivo ao item que persiste durante a sessão (e a vida útil da fila). Seu app pode saber o status da fila em termos de qual item está carregado (pode não estar em reprodução), carregando ou pré-carregado. A classe MediaStatus fornece estas informações de status:

  • Método getPreloadedItemId() – se o próximo item tiver sido pré-carregado, retorna o ID do item pré-carregado.
  • Método getLoadingItemId() – Retorna o ID do item que está sendo carregado (mas não está ativo na fila) no receptor.
  • O método getCurrentItemId() retorna o ID do item que estava ativo na fila (ele pode não estar sendo reproduzido) no momento em que a mudança de status da mídia ocorreu.
  • Método getQueueItems() (descontinuado, use MediaQueue) - Retorna a lista de instâncias MediaQueueItem como uma lista imutável.

Seu app também pode receber a lista de itens usando a classe MediaQueue. A classe é um modelo de dados esparso da fila de mídia. Ele mantém a lista de IDs de itens na fila, que é sincronizada automaticamente com o receptor. O MediaQueue não mantém todos os MediaQueueItem porque isso ocuparia muita memória quando a fila estiver muito longa. Em vez disso, ele busca os itens sob demanda e mantém um LruCache de itens acessados recentemente. Use estes métodos para acessar a fila de mídia:

  • O método getItemIds() retorna a lista de todos os IDs de itens em ordem.
  • Método getItemAtIndex() – Retorna o item em cache em um determinado índice. Se o item não estiver em cache, MediaQueue vai retornar null e programar a busca do item. Quando o item for buscado, MediaQueue.Callback#itemsUpdatedAtIndexes() será chamado, e chamar getItemAtIndex() com o mesmo ID novamente vai retornar o item.
  • fetchMoteItemsRelativeToIndex() é usado quando o usuário rola a interface da fila para cima ou para baixo, e o app quer buscar mais itens na nuvem.

Use esses métodos com os outros métodos de status de mídia para informar seu app sobre o status da fila e os itens nela. Além das atualizações de status de mídia do receptor, seu app pode detectar mudanças na fila implementando RemoteMediaClient.Callback e MediaQueue.Callback.

Além disso, o SDK do Cast oferece duas classes de utilitário para criar a interface de enfileiramento.

Por exemplo, para criar um RecyclerView usando 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);
}

Editar a fila

Para operar nos itens da fila, use os métodos da classe RemoteMediaClient. Com elas, é possível carregar uma matriz de itens em uma nova fila, inserir itens em uma fila existente, atualizar as propriedades dos itens na fila, fazer um item avançar ou voltar na fila, definir as propriedades da própria fila (por exemplo, mudar o algoritmo repeatMode que seleciona o próximo item), remover itens da fila e reordenar os itens nela.