Arquivo para a Lazer categoria

Robowebert Player, tocador de áudio em Java

Postado em Atividades profissionais, Lazer em 3 de Julho de 2009 por irmaodamara

Tenho desenvolvido nesses últimos meses (desde Fevereiro, para ser mais exato) um player de áudio escrito em Java no qual eu batizei de Robowebert Player. Ele reproduz áudio nos formatos MP3, OGG, Speex, FLAC e Monkey’s Audio, além dos formatos padrão do Java (AIFF, WAV e alguns outros). Suporta a leitura e salvamento de quatro formatos de playlists: M3U, PLS, XSPF e um formato próprio que estou desenvolvendo, chamado de RWPF. Além disso, possui um analizador de espectro, que é aquele monte de barrinhas que ficam subindo e descendo enquanto a música toca, além de controle de volume e de balanço, repetição de músicas, visualização dos metadados das músicas e uma barra de progresso meio capenga.

Tudo começou quando eu pesquisei pela Internet como fazer para tocar sons com Java. Encontrei um pequeno tutorial de como tocar arquivos MP3 usando a biblioteca JLayer, disponibilizada no site JavaZOOM.net e desenvolvi um minúsculo player que tocava apenas MP3 e que em sua interface possuía apenas três botões, um para selecionar a música, um para tocar a música e o último para parar de tocar a música. O player e mais a tela gráfica tinham cerca de umas cem linhas de código (ou nem isso). Com certeza, deve ser o menor player de MP3 da história.

Aí eu tive a idéia de desenvolver um player maior, que tocasse outros formatos de áudio além do MP3. Pensei em criar um subsistema para cada formato que o player fosse suportar. Entretanto, percebi o quanto isso iria ser difícil, pois a API da biblioteca JOrbis (biblioteca de suporte ao formato OGG) é completamente diferente da API do JLayer, além de mais complexa e de mais baixo nível.

Então, acessando o site do JavaZOOM acima citado, vi que os próprios desenvolvedores do JLayer desenvolveram um player em Java chamado JLGui, que suportava MP3, OGG e outros formatos de áudio. Era basicamente um clone do WinAmp e suportava os skins feitos para este. Resolvi testá-lo e não gostei muito de sua confusa interface, que além de confusa, a metade desta insistia em ficar na frente de todas as outras janelas. Para complicar, o player em si tinha uns bugs idiotas.

O JLGui é licenciado sob a LGPL, uma licença livre que me permite modificar o software de acordo com minhas necessidades. Entretanto, o código-fonte desse player é extremamente confuso, macarrônico e de extrema dificuldade de manutenção, além de ter sua camada de apresentação (o código responsável pela tela gráfica) colada na camada de negócios (o código responsável pela regra de negócios). Ou pior: todas as partes do player são coladas em várias outras partes.

Só para se ter uma idéia, se eu quisesse adicionar o suporte ao formato de playlist XSPF a este player, eu teria que fazer toda uma reengenharia no programa inteiro, praticamente.

A única parte que não era colada a nenhuma outra era o motor de execução de áudio, que foi concebido para ser aproveitado em outros softwares que desejassem tocar áudio com uma API de alto nível. Tal motor de execução era mantido em uma biblioteca separada chamada BasicPlayer.

O BasicPlayer utiliza uma API comum para todos os formatos de áudio baseada na API Java Sound, que usa Service Providers (bibliotecas especiais) que proveem o suporte aos formatos de áudio sem alterar o código-fonte que reproduz a música. Nas minhas pesquisas iniciais, eu já havia visto algo sobre a API Java Sound, entretanto, vi que ela era bastante confusa e de baixo nível. Já o BasicPlayer era de alto nível.

O que resolvi fazer? Criar um player que utilizasse o BasicPlayer como motor de execução de áudio. Aproveitei a interface simplória do minúsculo player que eu havia feito e a adaptei no BasicPlayer. A partir daí, fui implementando outras funcionalidades basicas, como controle de volume e de balanço e o botão de pausar e continuar a reprodução do áudio.

Aí o player foi evoluindo: passou a trabalhar com uma playlist na memória e a salvar e carregar um formato próprio de playlists baseado em XML, ganhou também botões de voltar à música anterior, voltar ao começo da música atual e ir para a próxima música.

Resolvi implementar o suporte à visualização dos metadados dos arquivos de áudio. O priemiro lugar onde pesquisei como fazer isso foi no macarrônico código do JLGui. Essa parte do código do JLGui não estava tão macarrônica e ligada às demais partes do player como as outras (só um pouco), então eu resolvi pegar este código e adapá-lo ao meu próprio player, fazendo alterações diversas a fim de retirar completamente a dependência das outras partes do JLGui.

Já com o suporte aos metadados das músicas e mesmo com a interface estando muito tosca, disponibilizei o player (ainda sem nome naquela época) para alguns membros da comunidade Linux versus Windows do Orkut para ver o que eles achavam. Eles emitiram suas opiniões e o que eles gostariam de ver no player.

Apartir daí, continuei a adicionar outros recursos ao player e a mudar um pouco sua interface (que ainda está tosca, mas menos do que antes). O último recurso adicionado até o momento foi o analizador de espectro, provido pela biblioteca KJ DSS.

O código-fonte do meu player, ao contrário do código do JLGui, é bastante claro e simples. O suporte à playlist na memória, por exemplo, é implementado por uma classe que gerencia um simples ArrayList contendo os objetos File, que provém acesso aos arquivos de áudio no HD. Já o JLGui implementa a mesma coisa com algumas classes, uma delas responsável por cada música na playlist (e que contém parte do código para manipular playlists no formato M3U – e manipular mal), outra cheia de métodos e mais uma interface gigantesca, além de mais algum código macarrônico colado na interface gráfica e em mais não sei onde.

Pelo fato da camada de apresentação ser completamente desacoplada da camada de negócios, será possível escrever telas gráficas alternativas ao visual atual do meu player. Inclusive, estou planejando para o futuro uma interface totalmente diferente e inovadora além da que já existe, além de uma interface alternativa usando a SwingWT, implementação alternativa (e mais leve) da API Swing baseada na biblioteca SWT.

No link abaixo, uma screenshot de como está o visual do meu player atualmente:

http://img30.imageshack.us/img30/4513/rwplayer.png

Ainda falta a grande maioria dos recursos que desejo implementar no meu player, como biblioteca de mídia, playlists dinâmicas, execução aleatória de músicas contidas numa playlist, edição de metadados das músicas, internacionalização e uma penca de outras coisas. O player vai ficar o bicho.

Entretanto, irei disponibilizar uma segunda versão pública com apenas alguns desses recursos, quando eu achar que ele está bom o suficiente para ser usado pelo público geral, ainda que incompleto. Irei disponibilizá-lo no SourceForge.net, onde já mantenho hospedado outro software que desenvolvo, o CapeTrivia.

Meu Player será licenciado sob a GPL 3, ou melhor, o código que escrevi está sob esta licença. O subsistema de leitura de metadados está sob a LGPL 2.0 pois não posso alterar a licença dessa parte, já que não fui eu que escrevi. E as demais bibliotecas estão nas suas respectivas licenças, todas compatíveis com a GPL 3.

Por falar em licenças, eu acabei tendo umas dúvidas com relação à compatibilidade destas, ainda mais por causa da bibblioteca que provê o suporte ao formato de playlist XSPF (JSpiff) estar na licença Apache 2.0 e haver código LGPL 2.0 no player. Resolvi mandar um e-mail para o Richard Stallman, presidente da Free Software Foundation (ou melhor, dois e-mails, o outro foi depois da resposta que ele me mandou). A troca de e-mails com o Stallman merece um post à parte (no próximo deste blog, quem sabe), mas resumidamente, ele respondeu que as licenças são todas compatíveis entre si.

Escolhi o nome Robowebert Player a fim de homenagear um antigo personagem das minhas histórias infantis de quando eu era criança e que eu mesmo inventei, o Robowebert. Este era um robô gigantesco ao estilo do Megazord dos Power Rangers que possuía vários componentes integrados e recursos diversos e que tinha a finalidade de lutar contra inimigos gigantescos que ameaçavam a cidade de Pret-a. O Robowebert era controlado pela Darker Webert, uma mulher que combatia o crime naquela cidade fictícia e que vivia cheia da grana. Ela também merece um post à parte, pois teve uma importância histórica na minha infância.

Não há uma previsão de quando a próxima versão pública (e desta vez disponível ao público geral e não só a alguns membros da Linux versus Windows) será disponibilizada, mas espero ver o Robowebert Player na próxima versão estável do Debian, codinome Squeeze, a ser lançada provavelmente no ano que vem.

A Volta dos Sonhos do Allan

Postado em Lazer em 18 de Dezembro de 2008 por irmaodamara

Em 2003, mais precisamente no dia 17 de agosto, criei no Blig (o blog do IG) o blog dos Sonhos do Allan e fiz neste dia o primeiro post deste, às 16:27, relatando dois sonhos, um curtinho, da época que eu tinha uns 5 anos e outro bem maior, tido em 1999, o chamado “sonho das três garotas”.

Nascia naquele dia o blog dos Sonhos do Allan, um blog onde eu postava os sonhos que eu tinha nas minhas noites de sono. E, desde então, geralmente em intervalos de uma semana, eu postava meus sonhos que eu tinha, às vezes eu postava um, às vezes eu postava dois, às vezes eu postava três e tinha vezes que eu postava mais de três sonhos em um só post.

No dia 6 de junho de 2004, após 35 posts, o blog dos Sonhos do Allan mudou de endereço, indo para o UOL Blog, isto porque o serviço de blog do IG estava deixando a desejar. O post número 36 ocorreu naquele dia, juntamente com a repostagem de todos os outros posts do antigo blog no Blig, para fins de arquivamento. E desde então o blog é mantido até os dias de hoje no UOL Blog.

Entretanto, a partir de 2007, comecei a diminuir o ritmo das atualizações, postando em intervalos maiores devido à minha falta de tempo (chegando a haver intervalos de dois e quatro meses entre um post e outro), já que eu estava dedicando boa parte deste na confecção do meu TCC da faculdade.

Após a entrega e a apresentação do meu TCC, cheguei a voltar a postar com uma certa freqüência, mas no dia 8 de outubro de 2007, fiz o último post naquele blog, o post de número 136 de sua história. Desde então, não tenho mais postado novos sonhos no blog dos Sonhos do Allan, principalmente devido à falta de motivação para mantê-lo, aliado ao pequeno número de acessos que ele vinha tendo.

Mas agora estou pensando seriamente em retomar este meu antigo blog e inclusive transferi-lo para o WordPress.com, ficando lado a lado com este blog onde escrevo neste momento. Desta vez, sem repostar os posts antigos. Em vez disso, disponibilizarei os antigos posts em um arquivo em PDF para quem quiser ler, além da opção dos internautas acessarem o arquivo do antigo blog no UOL Blog.

Minha motivação para escrever sonhos está voltando e ultimamente eu tenho tido uns sonhos legais, então eu creio que agora é hora do blog dos Sonhos do Allan voltar à ativa.

É provável que, quando eu postar novamente neste blog onde escrevo neste momento, eu já tenha retomando o meu “blog dos sonhos”, como eu o chamava.

Jogando no Orkut

Postado em Lazer em 4 de Agosto de 2008 por irmaodamara

Durante a semana, como eu já havia postado, eu faço estágio na faculdade, desenvolvendo um sistema de gerenciamento de reservas de equipamentos e salas da instituição, um sistema com interface web em JSP, que cada vez mais está ficando melhor, com mais recursos e tendo bugs corrigidos.

Como eu passo praticamente o dia inteiro no estágio devido ao horário ruim deste, que vai desde às oito da manhã até às sete da noite (com um intervalo mostruoso de almoço de três horas, intervalo este que uma parte dele é usada para almoçar e o restante eu acabo usando para desenvolver o sistema, fazendo assim mais horas de estágio do que as oito horas combinadas), e este horário aliado ao tempo de trajeto de ida e volta do ônibus, tenho que acordar às seis e meia da madrugada e só chego em casa às oito, sobrando duas horas de tempo livre para comer, tomar banho e fazer mais alguma coisa rapidamente, como ver um pouco de TV (geralmente os clipes da VH1 ou as notícias do BandNews) ou ligar o PC e fazer algumas outras coisas que não faço no estágio, como acessar o Orkut, que é bloqueado pelo mal-encarado sistema de bloqueio de sites intitulado Intragov, que me parece que é usado em todas as instituições públicas do estado de São Paulo e bloqueia até arquivos com certas extensões.

Como o tempo é curto, só dá para ver o que tá rolando nos tópicos das comunidades, os recados deixados e só, mais nada, ainda que às vezes eu use alguns aplicativos do OpenSocial que eu adicionei no meu Orkut, como o BuddyPoke, onde tem os bonequinhos dos amigos que se abraçam, tocam guitarra, dão soco na cara do outro, etc. E o tempo na Internet é disputado com outras coisas além do Orkut.

Quando chega o fim de semana, então eu tenho tempo de me divertir na Internet, ver vídeos no Youtube (ontem, eu vi dois episódios do Jaspion, um seriado japonês dos anos oitenta que será motivo de um post futuro), ouvir música, postar neste blog e, mais recentemente, jogar no Orkut pelos aplicativos do OpenSocial no Orkut, principalmente os jogos da Come2Play, onde é possível jogar com outros membros do Orkut e até com membros de outras redes sociais que têm suporte ao OpenSocial, como o MySpace.

Os jogos da Come2Play que eu jogo são basicamente três: xadrez, Simão e dardos. O primeiro é o meu preferido, eu gosto muito de jogar xadrez e poder jogar xadrez no Orkut significa poder jogar xadrez com pessoas de qualquer parte do mundo no conforto de casa, mais precisamente no meu quarto. Já ganhei e já perdi de muitos enxadristas, principalmente americanos usuários do MySpace. Eu mais ganho do que perco, empate houve apenas um, numa partida emocionante onde só sobrou os reis e mais uma ou outra peça no final.

Nos jogos da Come2Play, é possível apostar fichas nas partidas, pode-se não apostar nenhuma ficha, apostar uma, cinco, dez, cinqüenta, cem, quinhentas ou mil. Nos jogos de xadrez, não costumo fazer grandes apostas, no máximo cinco fichas. E o sistema de fichas é integrado para todos os jogos, as que você ganha em um jogo, pode apostar em outro. Eu tenho, no momento, umas duzentas e poucas fichas que ganhei apostando nos jogos, na sua maioria no Simão. O sistema de fichas também permite comprar objetos de status para enfeitar o painel de estatísticas, como uma coroa, um martini (que só serve de enfeite, não dá para beber), etc. Com o meu saldo atual, dá apenas para comprar um capacete de chifre (e eu não vou querer comprar isso, obviamente, e nem pretendo comprar itens do gênero). Uma curiosidade sobre a seção de compra de objetos de status é que esta está traduzida porcamente para o português.

Um outro jogo que eu jogo bastante é o Simão (ou Simon, no nome original em inglês), que consiste num painel de quatro botões coloridos, um vermelho, um verde, um azul e um amarelo. A cada rodada, o jogador deve repetir toda a seqüência de botões apertados e, ao final desta, deve apertar mais um botão para a seqüência, que a cada rodada fica maior e mais difícil de memorizar. É um jogo bom para treinar a memória. E como eu já adiantei, é o jogo onde mais eu ganho fichas, eu sempre costumo fazer apostas mais altas neste jogo, chegando a apostar cinqüenta fichas em algumas partidas. Como eu tenho boa memória, acabo levando uma certa vantagem sobre a maioria dos adversários. Entretanto, às vezes eu perco também.

Numa dessas partidas, uma ocorrida hoje, que inclusive eu perdi cinqüenta fichas (mas o meu adversário ganhou merecidamente), acabou sendo a partida mais difícil e mais emocionante até agora, durando cerca de 35 rodadas até eu esquecer o final da seqüência, apertando o botão amarelo onde não era para apertar. A partida demorou bastante para acabar e, de tanto repetir a seqüência, acabei até memorizando parte dela. A partida terminou às 16:30 mais ou menos, portanto, já faz horas que joguei tal partida. A seqüência (ou a maior parte dela) foi: verde, verde, verde, verde, verde, verde, azul, vermelho, vermelho, vermelho, amarelo, verde, verde, verde, azul, vermelho, amarelo, verde, verde, verde, azul, azul, amarelo, amarelo, vermelho, verde, verde, verde, e o resto eu não me lembro (memorizei a ordem de 28 dos 35 botões da seqüência), acho que a vigésimo nono botão era o azul, mas não tenho certeza.

O Come2Play, para se manter, insere anúncios no painel dos jogos, quando uma partida é disputada, geralmente à direita, e também no inicio e no fim das partidas. Dentre os anúncios, há alguns do Google Adsense (alguns destes aparecem em um idioma não identificado, provavelmente russo ou grego) e principalmente anúncios sobre jogos produzidos por terceiros, como o do MechQuest e do Flyff (abreviatura de Fly For Fun). Este último exibe nos anúncios (são basicamente dois) uma mulher muito bem desenhada em mangá e muito boazuda, com os seios fartos quase que completamente de fora e vestida com trajes extremamente esquisitos (duas mulheres, para falar a verdade, uma em cada anúncio). Os anúncios chegam a ser quase que indecentes. Provavelmente deve ser mais um daqueles RPGs com seres esquisitos e com personagens com roupas esdrúxulas.

Retornando aos jogos do Come2Play, um outro jogo que eu jogo (comecei a jogar este fim de semana) é o de arremesso de dardos. Consiste em fazer trezentos pontos arremessando dardos num alvo, com cada área valendo alguns pontos, podendo estes serem multiplicados por dois ou por três caso atinjam uma determinada área minúscula. Os turnos são sempre de três em três dardos, um jogador joga três dardos e depois o outro joga três dardos e assim vai indo até alguém fazer os trezentos pontos. É um jogo onde praticamente só há americanos (e outros falantes do idioma inglês) jogando. Contrasta com o Simão, onde os que jogam são quase que na sua totalidade de brasileiros. Já no xadrez, há um misto de brasileiros e americanos, ainda que com mais americanos do que brasileiros.

Ao contrário do jogo de xadrez, este jogo parece ter sido feito nas coxas e possui vários bugs que chegam a atrapalhar e a interferir no resultado das partidas, por isso, eu raramente aposto fichas neste jogo. Os bugs são horríveis, por exemplo, numa partida que eu disputei, quando eu completei os trezentos pontos, os pontos do turno não foram computados, ou então, quando terminei de arremessar os três dardos, o jogo deu uma travadinha de depois, um quarto dardo foi lançado no alvo e meus pontos não foram computados, ou então quando um dardo é lançado sem eu dar o comando, ou quando o adversário está jogando, mas o sistema indica que é a minha vez, como é o adversário que está no comando, não tenho como lançar os dardos, então os dardos ficam sem ninguém poder lançar, daí o tempo acaba e eu perco, ou então quando o sistema diz que eu estou desconectado da Internet, mas eu continuo conectado normalmente. Eles não deveriam fazer o aplicativo nas coxas e já liberar para uso. Espero que os bugs sejam corrigidos.

Além do jogo de dardos, o Simão apresenta um ou outro bug, ainda que mais raramente. Uma vez ou outra, quando se aperta um botão, aciona-se outro, muitas vezes fazendo o adversário perder. Mais o jogo é bem mais estável, apesar disso.

De vez em quando, os servidores do Come2Play acabam saindo do ar por excesso de tráfego, de vez em quando, o IIS (servidor web usado pelo serviço de jogos online) não agüenta o número de jogos simultâneos e dá pau, exibindo uma mensagem de erro. Acredito que, se usassem o Apache (e com servidor Linux ou FreeBSD ao invés de Windows Bad Server) no lugar do IIS, esses problemas provavelmente não ocorreriam.

Além desses três jogos, joguei o jogo da velha também, mas eu só empatei e não gostei do jogo. É provável que eu procure outros jogos para jogar além dos três que eu já jogo. Tem jogo de damas, quebra-cabeça, bilhar, bolas de gude e outros.

Então é isso, e este post termina aqui! Até o próximo post! E viva os anúncios quase que eróticos do Flyff!