Arquivo de julho, 2010

Mais sobre o Robowebert Player

Posted in Atividades profissionais, Lazer, Música on 12/07/2010 by Allan Taborda

Nesses meses nos quais fiquei sem postar no blog, eu não tive vontade e inspiração para escrever algo interessante aqui, então eu acabei não postando nada nesse tempo. Cheguei a iniciar um post acerca dos meus gostos musicais, mas não acabei concluindo-o, apesar dele já estar bem extenso.

Há um ano atrás, escrevi um post sobre o tocador de áudio em Java que eu estava desenvolvendo em meu tempo livre, o Robowebert Player. Eu ainda desenvolvo o player no meu tempo livre, e ele evoluiu bastante desde aquele post até agora, ainda mais que ele é o meu player principal para ouvir música.

Como eu havia adiantado no último post, ele já possui suporte ao preenchimento automático da playlist. Este é, na minha opinião, o recurso mais importante implementado até aqui, de grande importância nas vezes que eu escuto música, pois gosto de escutar músicas variadas, mas não gosto de ter que ficar populando a playlist com músicas manualmente ou com playlists pré-definidas. Este preenchimento automático consiste em sortear uma música contida em uma das pastas previamente cadastradas em um arquivo de configuração (que é editado manualmente, mas posteriormente eu irei implementar o suporte ao acesso ao banco de dados e então a lista de pastas passará a estar no banco). A cada vez que uma música termina, esta é removida da playlist e, caso a playlist tenha menos do que um determinado número de músicas (definido nas configurações do player), o randomizador (como é chamado o sistema que sorteia as músicas) sorteia uma ou mais músicas, até a playlist atingir o número estipulado de músicas. Na maioria das vezes, ao acabar uma música, esta música sai e outra é adicionada ao final da playlist.

Também adiantei no último post que o player passou a permitir configurações personalizadas. Algumas dessas configurações podem ser alteradas pela própria interface do player, clicando no checkbox correspondente, por exemplo. Outras só podem, pelo menos até o momento, serem alteradas editando manualmente o arquivo de configuração. Para gerenciar essas configurações, de início eu usei a classe Properties, do pacote java.util, mas depois fiz a minha própria implementação da classe que guarda as propriedades, com recursos extras, como o de salvar as propriedades no disco assim que uma propriedade é alterada e métodos próprios para salvar e recuperar valores numéricos e booleanos, além de manter as propriedades em ordem alfabética e usar a codifcação UTF-8 ao salvar o arquivo. Essa classe que gerencia as propriedades poderá ser usada em outros programas que por ventura eu possa desenvolver.

Por falar nas configurações, recentemente eu passei a separar as configurações referentes ao funcionamento do player das configurações referentes à interface gráfica, em arquivos diferentes.

Na interface, os botões, com exceção dos que servem para subir e descer uma música na playlist, foram todos para a parte de baixo da tela, num total de dez botões. O botão de tocar agora também é o de pausar e continuar e o botão de adicionar também adiciona playlists salvas, além das músicas. Há um botão também para ativar e desativar o randomizador de músicas. O analizador de espectro ganhou mais espaço com a saída dos botões da parte superior esquerda da tela. Além disso, o tamanho da tela foi ajustado para ficar do tamanho adequado para monitores maiores (se bem que estou pensando em alterar isso novamente, fazendo o tamanho da tela se adequar melhor ao tamanho do monitor) e a tabela que mostra a playlist na memória foi ligeiramente modificada, tendo sua última coluna diminuído de tamanho e centralizada.

Foram feitas modificações no suporte aos metadados das músicas (informações de artista, nome da música, álbum, ano, etc). Agora foi adicionada a biblioteca JAudioTagger, que é usada na leitura dos metadados dos arquivos de áudio no formato FLAC, que antes não havia suporte à leitura dos metadados. Na verdade, o JAudioTagger é usado para ler os metadados de qualquer arquivo de áudio, com exceção dos áudios em MP3, OGG e Monkey’s Audio (os dois primeiros porque o código antigo, baseado em um pedaço do JLGui, que é outro player de áudioem Java (ver o post publicado há um ano atrás para mais detalhes), possui uma performance melhor na leitura das informações, e o último pelo fato do JAudioTagger não possuir até o momento o suporte a este formato de áudio).

Houve também modificações internas no player, como a inclusão de um pool de threads (usado em todo o player sempre que uma thread é criada, com exceção do motor de execução de áudio, que gerencia a thread princial manualmente), a criação de uma classe com métodos estáticos contendo as rotinas mais usadas e de uma interface contendo valores constantes (e as classes que vão usar esses valores implementam a interface), além de outras alterações internas no código.

Outras coisas que foram implementadas: o suporte ao formato de playlist conhecido como SMIL, usado no Windows Media Player, a geração de logs com os erros ocorridos internamente, a possibilidade do “Look and Feel” do player ser alterado (só há duas opções, por enquanto), dois novos painéis modais para a escolha das músicas manualmente (que podem ser escolhidos pelas configurações do player), suporte ao salvamento do estado do player (ele pode ser fechado e reaberto posteriormente, sem que o conteúdo da playlist e o estado interno do randomizador sejam perdidos), o início da implementação de uma interface em modo texto para o tocador de áudio, uso do KJDSS 1.3 (última versão da biblioteca do analisador de espectro até o momento, com a possibilidade de usar o analizador de espectro antigo aterando uma configuração), modificações nessa biblioteca, dentre outras coisas implementadas.

Ainda faltam muitos recursos dos que eu gostaria de adicionar a este player, como cronômetro, a possibilidade de se voltar ou avançar para um ponto qualquer no meio da música e a alteração dos metadados das músicas. Pretendo também traduzir a interface do player para outros idiomas, usando uma biblioteca de gerenciamento de traduções também escrita por mim e que ainda não está pronta.

Estou pensando em, ainda esse ano, disponibilizar o código do player no Sourceforge.net, ainda não o fiz por falta de tempo, ainda mais que, para isso, terei que elaborar um texto em inglês apresentando o software. Mas, para aqueles que pedirem, eu posso estar enviando o código por e-mail.

Por hoje é só, até a próxima vez.