Criando o Windows 8
Blog da Loja do Windows para desenvolvedores
Visual Studio blog
IEBlog Português
Blogs da Equipe do Windows
Blog Inside Windows Live
Baixe o Windows 8 Release Preview
Dev Center - aplicativos com o estilo Metro
Siga-nos: @windevs
Conferência sobre a criação do Windows
Aplicativos com o estilo Metro do Windows
Developer Center de Windows Client
Realizamos algumas alterações no sistema de áudio do Windows 8 para melhorar a experiência com o aplicativo. Neste blog, vou falar dessas alterações e de como é possível aproveitá-las nos aplicativos de mídia. Espero que as informações o ajudem a entender melhor o funcionamento do áudio nos aplicativos da Windows Store, principalmente no que se refere à reprodução de áudio em segundo plano. Vou começar descrevendo uma situação comum ao usuário.
Você está ouvindo sua banda preferida em um aplicativo de música do Windows e um amigo lhe envia um mp3 de uma versão ao vivo de uma música da banda preferida dele. Quando você abre o mp3, o Windows Media Player inicia e começa a tocar a música. Agora tanto a sua banda favorita quanto a dele estão tocando ao mesmo tempo. O alarme então dispara, como lembrete de que é hora de buscar sua irmã na escola, no meio de uma bagunça sonora. Você entra em pânico e fecha o laptop. Se você for como eu, provavelmente está procurando uma forma melhor de administrar os sons emitidos pela sua máquina.
No caso dos aplicativos do Windows 8, solucionamos o problema introduzindo o Gerenciador de Reprodução de Mídia e os controles de Transporte de Mídia. O Gerenciador de Reprodução de Mídia utiliza categorias de áudio, que atribuem comportamentos a fluxos de áudio, e, por extensão, a aplicativos de áudio. Os fluxos de áudio de entrada no primeiro plano são sempre permitidos para a reprodução de áudio. Porém, ao marcar os fluxos, o Gerenciador de Reprodução de Mídia pode tomar decisões inteligentes sobre como lidar com vários fluxos no primeiro e no segundo planos.
Por exemplo, se um aplicativo que é capaz de funcionar em segundo plano estiver reproduzindo música e passar para o segundo plano e o usuário abrir um novo aplicativo no primeiro plano para a reprodução de música, o Gerenciador de Reprodução de Mídia desativará o áudio no aplicativo no segundo plano. Dessa forma, a experiência se torna mais fluida e intuitiva para o usuário. O usuário ouve o que quer ouvir, e não o que não quer. Com atenuação inteligente da música em segundo plano para os alertas (como alarmes e toques) e facilidade de acesso aos controles de Transporte de Mídia para interromper trilhas musicais, pular para a trilha anterior ou seguinte, desenvolvemos um sistema para que você não entre em pânico nem enlouqueça procurando aplicativos que fazem barulho quando você não quer.
Nas versões anteriores do Windows, os usuários podiam ter vários aplicativos abertos e em execução simultânea. Em termos de áudio, eles podiam minimizar o media player, trabalhar em um documento e navegar na Web ao mesmo tempo, em um grande monitor. Com dois monitores, eles podiam ser muito mais multitarefa. No novo ambiente imersivo do Windows 8, as coisas mudaram quanto ao número de aplicativos visíveis na tela de uma vez. Com apenas um aplicativo no corpo e um ajustado, é mais problemático encontrar o aplicativo que está emitindo o som se ele estiver na pilha traseira. Esse é o principal motivo da evolução do Gerenciador de Reprodução de Mídia e dos controles de Transporte de Mídia. Com esses recursos, ficou muito mais fácil iniciar e interromper as músicas quando necessário. E, como o Gerenciador de Reprodução de Mídia pode desativar o áudio dos aplicativos que não devem emitir som, ele evita que os usuários tenham de percorrer a pilha de aplicativos até encontrar o que precisa ser desativado.
Não existe mixer de áudio nesse ambiente, como na área de trabalho. Ainda existem aplicativos de desktop, mas o seu aplicativo não será exibido aqui, porque não acreditamos que seja uma boa experiência entrar na área de trabalho para ajustar volumes relativos dos aplicativos. Em vez disso, preferimos que os aplicativos não incluam controles de volume. Dessa forma, os usuários se concentram no controle de volume principal, o que também ajuda a simplificar toda a experiência com o controle de volume, mas essa é outra história.
Para que o sistema possa gerenciar quando os fluxos de áudio podem ou não ser ouvidos, adicionamos categorias de fluxo. Assim, o Windows pode tomar algumas decisões lógicas sobre quando o áudio deve ser ouvido. As categorias de áudio determinam como lidar com os fluxos quando os aplicativos estão no primeiro plano (aplicativo visível no monitor do dispositivo) ou no segundo plano (aplicativo oculto por outro). Os aplicativos entram no primeiro plano quando iniciados ou tocados na tela. Eles também ficam no primeiro plano quando estão ajustados.
Por exemplo, um aplicativo que reproduz alguns sons incidentais - toques ou cliques interativos, que provavelmente não precisam ser ouvidos ao fundo. Seria inconveniente. Por isso, o Gerenciador de Reprodução de Mídia desativa o áudio do aplicativo assim que ele passa para o segundo plano. Porém, o aplicativo de mídia que estiver executando sua lista de reprodução de músicas deve continuar a reprodução para que você possa navegar na Web ou trabalhar enquanto ouve música.
Esta é uma rápida descrição de como usar as categorias de áudio. A maneira mais fácil de reproduzir áudio em um aplicativo do Windows 8 é por meio de uma marca de áudio.
<audio controls="controls"> <source src="song.mp3"/> </audio>
JavaScript
audtag = document.createElement('audio'); audtag.setAttribute("id", "audtag"); audtag.setAttribute("msAudioCategory", "BackgroundCapableMedia"); document.getElementById("MediaElement").appendChild(audtag); audtag.load();
C#
Na linguagem C#, é possível definir a categoria de áudio desta forma:
Playback.SetAudioCategory(AudioCategory.BackgroundCapableMedia); Playback.SelectFile();
Existem várias categorias de áudio para escolha. A tabela inclui as categorias disponíveis e fornece uma descrição do comportamento associado a cada uma. Você precisa escolher atentamente qual categoria será associada a qual fluxo, porque isso muda o comportamento do aplicativo.
Categorias de fluxo disponíveis
Tipo de fluxo
Descrição
Aceita funcionar em segundo plano?
ForeGroundOnlyMedia
Jogos ou outros sons que funcionam somente no primeiro plano, mas que desativarão os sons da mídia em segundo plano.
Não
BackgroundCapableMedia
Para o áudio que precisa continuar sendo reproduzido em segundo plano. Exemplos:
Sim
Comunicações
Para comunicação de streaming de áudio, como:
Alerta
Sons de alerta em looping ou mais demorados:
GameMedia
Música em segundo plano reproduzida por um jogo
GameEffects
Efeitos sonoros de jogos desenvolvidos para se misturarem ao áudio existente, como:
SoundEffects
Sons desenvolvidos para se misturarem ao áudio existente, como bipes, toques e outros efeitos rápidos
Outros
A categoria de fluxo padrão usada para fluxos não categorizados.
Aqui vão algumas dicas para ajudá-lo a decidir como categorizar seu fluxo de áudio:
[O comportamento dos aplicativos está documentado mais detalhadamente no artigo em inglês Audio Playback in a Metro Style App (Reprodução de áudio em aplicativos estilo Metro)]
O motivo maior para determinar se um aplicativo pode ser ouvido baseia-se, principalmente, no fato de ele estar ou não em primeiro plano. Porém, quando você elabora outras considerações, como os aplicativos de comunicação e os aplicativos de mídia que podem ser executados em segundo plano, tudo se complica. Mas não se preocupe, em geral, é muito fácil de explicar o comportamento do aplicativo com base no tipo de fluxo. Estas são as regras aplicáveis:
Quando você escolhe uma categoria de aplicativo, deve seguir algumas regras para que o aplicativo funcione como esperado. Para que o aplicativo execute áudio em segundo plano, é preciso:
Para as categorias que não executam áudio em segundo plano, não é preciso usar um tipo de mídia que reproduza áudio em segundo plano. Escolha Outro ou use GameEffects ou outro tipo relevante.
Para obter informações gerais sobre como usar aplicativos em segundo plano, consulte http://blogs.msdn.com/b/windowsappdev_br/archive/2012/06/01/ser-produtivo-no-segundo-plano-tarefas-em-segundo-plano.aspx.
Em espera conectado é um novo estado de baixo consumo de energia do Windows 8 que permite um modo de energia parecido com o do smartphone em dispositivos SoC (sistema em chip). No modo em espera conectado, o dispositivo parece estar desligado, mas não está. Os aplicativos podem continuar a reproduzir música em segundo plano, receber atualizações e usar a rede. Para obter mais informações, verifique a postagem no blog em sobre como diminuir o consumo de energia dos aplicativos. Para o fluxo dos aplicativos de música, existem alguns procedimentos importantes, caso você queira que seu aplicativo de áudio em segundo plano continue a fluir da rede quando o dispositivo entrar em espera conectado.
Em suma, se a conexão da rede não estiver ativa, o aplicativo não executará áudio de streaming. O áudio local funciona bem, mas se você tiver um servidor a ditar uma lista de reprodução, o aplicativo não terá acesso à próxima música até a rede estar ativada.
Para que o aplicativo continue a manter o fluxo de música, mesmo quando o dispositivo está em espera conectado, há três opções:
Para obter detalhes sobre essas opções, consulte o artigo em inglês Writing a power savvy background media app (Desenvolvendo um aplicativo de mídia de segundo plano com consumo inteligente de energia).
As notificações SoundLevel ajudam os aplicativos a saber quando podem ser ouvidos. Quando começamos a desenvolver o Gerenciador de Reprodução de Mídia, não tínhamos certeza se enviaríamos notificações aos aplicativos para informá-los de que seu áudio estava desativado; logo percebemos que os aplicativos ficariam em segundo plano processando áudio ou vídeo e consumindo recursos do sistema desnecessariamente, o que esgotaria a bateria. Portanto, quando você registra o aplicativo para receber notificações SoundLevel, o Gerenciador de Reprodução de Mídia envia ao aplicativo uma dessas três notificações, dependendo do estado audível do aplicativo:
Vamos falar sobre o motivo de cada notificação ser enviada e o que o aplicativo deve fazer em resposta a cada uma.
A notificação SoundLevel(Full) será enviada ao aplicativos quando:
O que o aplicativo deve fazer:
Um aplicativo que não possa ser executado em segundo plano é transferido do segundo plano para o primeiro
Não requer qualquer ação
O aplicativo primeiro fica visível após a inicialização
A notificação SoundLevel(Mute) será enviada ao aplicativo quando:
Um aplicativo que não possa ser executado em segundo plano é transferido do primeiro plano para o segundo
Pausar
Outro tipo de fluxo semelhante começa a ser reproduzido enquanto o aplicativo está em execução (por exemplo, um segundo fluxo BackgroundCapableMedia começa enquanto outro está sendo reproduzido; o áudio do mais antigo é desativado)
Pausar (a menos que você tenha um bom motivo para não fazê-lo) para economizar recursos do sistema
Se um tipo de fluxo de Comunicação estiver no segundo plano, ele receberá um SoundLevel(Mute) quando outro fluxo de Comunicação for iniciado no primeiro plano
Colocar a chamada em espera
A notificação SoundLevel(Low) será enviada ao aplicativo quando:
Um fluxo de comunicação começa a ser reproduzido enquanto o aplicativo está reproduzindo áudio
Pausar se ele estiver reproduzindo conteúdo que você não quer que o usuário perca. Pode ser ouvido, mas o volume ficará baixo, a menos que ele seja transferido para o primeiro plano. Embora você possa escolher, é recomendável pausar.
Esta é uma amostra de como registrar e usar os eventos SoundLevel:
// Create the media control. mediaControl = Windows.Media.MediaControl; // Add event listeners for PBM notifications to illustrate app is // getting a new SoundLevel and pass the audio tag to the function mediaControl.addEventListener("soundlevelchanged", soundLevelChanged, false);function soundLevelChanged() { // Catch SoundLevel notifications and determine SoundLevel state. If it's muted, pause the player. var soundLevel = Windows.Media.MediaControl.soundLevel; switch (soundLevel) { case Windows.Media.SoundLevel.muted: log(getTimeStampedMessage("App sound level is: Muted")); break; case Windows.Media.SoundLevel.low: log(getTimeStampedMessage("App sound level is: Low")); break; case Windows.Media.SoundLevel.full: log(getTimeStampedMessage("App sound level is: Full")); break; }
// add new handlers MediaControl.SoundLevelChanged += MediaControl_SoundLevelChanged; MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed; MediaControl.PlayPressed += MediaControl_PlayPressed; MediaControl.PausePressed += MediaControl_PausePressed; MediaControl.StopPressed += MediaControl_StopPressed; // save current handlers SoundLevelChangedHandler = MediaControl_SoundLevelChanged;string SoundLevelToString(SoundLevel level) { string LevelString; switch (level) { case SoundLevel.Muted: LevelString = "Muted"; break; case SoundLevel.Low: LevelString = "Low"; break; case SoundLevel.Full: LevelString = "Full"; break; default: LevelString = "Unknown"; break; } return LevelString; }
Acrescentamos algumas considerações sobre captura e loopback. Primeiramente, se você optar por criar um aplicativo com base em captura, precisará utilizar a categoria "Outro" para marcar seu fluxo de captura (ou o sistema atribuirá essa categoria); no entanto, o mais importante é que não é possível capturar fluxo com outra categoria. Para os aplicativos de Comunicação, depois de rotular o fluxo de processamento como Comunicação, você não precisará marcar o fluxo de captura.
Além disso, quando o sistema envia SoundLevel(Mute), o áudio de processamento, captura e loopback é desativado.
Embora a visibilidade do aplicativo esteja intimamente associada à sua capacidade audível, é importante ouvir somente os eventos de SoundLevel se quiser saber quando o aplicativo será ouvido. Não utilize eventos de visibilidade para isso ou o estado audível do aplicativo poderá ficar fora de sincronia com seu estado visível.
[Consulte Controles de transporte de mídia para ter um guia de uso completo.]
A inclusão do controle de Transporte de Mídia disponível globalmente (exibido na próxima imagem) facilita muito a reprodução e o controle de músicas em um aplicativo de música.
Figura 1 - Visão da tela inicial com o controle de Transporte de Mídia
Figure 2 - Visão recortada do controle de Transporte de Mídia apenas, mostrando a arte do álbum e os metadados.
A interface do usuário do MTC (como conhecida pela equipe da plataforma de mídia) permite que o usuário reproduza/pause áudio no primeiro plano ou no segundo plano, mesmo que o aplicativo tenha sido suspenso no segundo plano. A interface do usuário é chamada quando o usuário pressiona os botões de volume no teclado ou no slate. Aparece em qualquer lugar: o novo ambiente imersivo, a área de trabalho e até mesmo a tela de bloqueio. É um grande acréscimo ao Windows 8, e seus aplicativos podem (e devem) fazer uso deles quando apropriado.
Voltando ao cenário inicial (em que o usuário tem vários áudios em execução e fecha o laptop), é por esse motivo que sentimos que um controle de transporte global desse tipo era necessário. Como não há várias janelas para alternância, como na área de trabalho, os usuários precisam de uma forma de interromper o aplicativo que está emitindo som rapidamente. Acreditamos que associar a interface do usuário do MTC aos controles de volume proporcionaria um recurso intuitivo e muitos detalhes sobre o que está em execução no sistema do usuário com um pressionamento de botão.
Se você está usando um aplicativo de mídia (e principalmente um que aceita execução em segundo plano, veja como associá-lo aos controles:
JavaScript:
// Assign the button object to MediaControlsMediaControls = Windows.Media.MediaControl;// Add event listeners for the buttonsMediaControls.addEventListener(“playselected”, play, false);MediaControls.addEventListener(“pauseselected”, pause, false);MediaControls.addEventListener(“playpausetoggleselected”, playpausetoggle, false);
using Windows.Media;MediaControl.SoundLevelChanged += MediaControl_SoundLevelChanged; MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed; MediaControl.PlayPressed += MediaControl_PlayPressed; MediaControl.PausePressed += MediaControl_PausePressed; MediaControl.StopPressed += MediaControl_StopPressed;
O próximo snippet de código mostra como habilitar os botões Faixa Anterior e Próxima Faixa, adicionando ouvintes de eventos ao objeto MediaControl.
// enable the previous track buttonMediaControls.addEventListener(“previoustrackselected”, previoustrack, false);// enable the next track buttonMediaControls.addEventListener(“nexttrackselected”, nexttrack, false);
MediaControl.NextTrackPressed += MediaControl_NextTrackPressed; MediaControl.PreviousTrackPressed -= MediaControl_PreviousTrackPressed;
Você também pode adicionar metadados artísticos e arte ao menu suspenso. Veja mais detalhes no white paper mencionado acima.
A interface do usuário do MTC é preenchida com o aplicativo de mídia em uso. A interface do usuário permanece preenchida até ser limpa pelo sistema. As situações em que a interface do usuário será limpa são:
Trabalhamos intensamente para criar um paradigma de áudio totalmente novo para o Windows 8, que se alinha com os fatores forma e oferece uma nova experiência ao usuário do Windows. As categorias de áudio oferecem contexto ao Windows para que o sistema possa tratar o aplicativo corretamente. Se o aplicativo precisar reproduzir áudio em segundo plano, você só precisará definir essa categoria, conectar os controles de transporte de mídia e declarar no manifesto.
As notificações SoundLevel permitem que você saiba se os aplicativos podem ser ouvidos pelo usuário. Com isso, você tem as informações de que necessita e ajuda a economizar bateria, pausando o áudio se ele não puder ser ouvido no segundo plano.
A interface do usuário do Transporte de Mídia mostra o estado do volume, o que permite aos usuários iniciar e interromper o áudio rapidamente e obter informações do artista, em um aplicativo de mídia.
Esperamos que você use essas novas tecnologias em seus aplicativos para garantir uma excelente experiência com áudio aos clientes. É tudo fácil de implementar e pode representar um grande retorno do investimento para os usuários.
-- Johnny Bregar, gerente de programas, Windows