Introdução

O player Amarok é um programa de computador usado para a reprodução de áudio em ambiente KDE, compatível com sistemas operacionais Unix tais como o Linux e o FreeBSD. Embora o Amarok possa operar com listas de reprodução e pastas, ele utiliza o conceito de etiquetas (tags).

Lançado em 23 de junho de 2003 para Linux e posteriormente lançado para Windows, o Amarok se tornou um dos players de música mais conhecidos para Linux.

interface AMAROK

Principais características:

✔ Múltiplas listas de reprodução;

✔ Aparência configurável através de CSS;

✔ Indexação das coleções de música em um banco de dados: SQLite ou MySQL;

✔ Possibilidade de baixar letras de música e capas de álbuns da Internet;

✔ Suporte ao DCOP;

✔ Rápido e simples arrastar e soltar para a criação de listas de reprodução;

✔ Possui boas opções de configuração para gestão de energia;

✔ Visualizações com libvisual;

✔ Geração automática de estatísticas de reprodução;

O que é Thread?

Thread é um pequeno programa que trabalha como um subsistema, sendo uma forma de um processo se autodividir em duas ou mais tarefas. É o termo em inglês para Linha ou Encadeamento de Execução. Essas tarefas múltiplas podem ser executadas simultaneamente para rodar mais rápido do que um programa em um único bloco ou praticamente juntas, mas que são tão rápidas que parecem estar trabalhando em conjunto ao mesmo tempo.

Quais as vantagens e desvantagens de se usar Threads?

Os threads possuem vantagens e desvantagens ao dividir um programa em vários processos. Uma das vantagens é que isso facilita o desenvolvimento, visto que torna possível elaborar e criar o programa em módulos, experimentando-os isoladamente no lugar de escrever em um único bloco de código. Outro benefício dos threads é que eles não deixam o processo parado, pois quando um deles está aguardando um determinado dispositivo de entrada ou saída, ou ainda outro recurso do sistema, outro thread pode estar trabalhando. No entanto, uma das desvantagens é que com vários threads o trabalho fica mais complexo, justamente por causa da interação que ocorre entre eles.

Biblioteca ThreadWeaver

Os códigos do player AMAROK utilizam a biblioteca ThreadWeaver para implementar os threads do programa.


O que é ThreadWeaver ?

O ThreadWeaver é um auxiliar para programação multithread. Ele utiliza uma interface baseada em trabalho para enfileirar processos e executá-los de maneira eficiente. O programador divide a carga de trabalho em tarefas e declara as dependências entre cada uma delas. Após isso, o ThreadWeaver resolverá a maneira mais eficiente de dividir o trabalho entre os threads dentro de um conjunto de limites de recursos.


Uso do ThreadWeaver no AMAROK

Para a utilização da biblioteca ThreadWeaver, a mesma é declarada nos códigos em que é usada.

Inclusão da biblioteca ThreadWeaver/Job no código Mp3tunesWorkers.h

A inclusão possui o complemento "Job" pois o código requer processamento de threads em tarefas.

Função da ThreadWeaver

A ThreadWeaver é uma fila de jobs. Executa trabalhos em threads que gerencia internamente. O número mínimo e máximo de encadeamentos fornecidos por um Weaver é definido pelo usuário. Os jobs são tratados como objetos, no caso, QObjects. Por exemplo:

Inclusão de um job por meio de QObject, no caso, o job de debugar mensagens enviadas ao sistema de login. Trecho do código DebugLogger.h

Como os jobs são QObjects, é permitido que o usuário se conecte ao sinal done(), que é notificado quando um job foi executado. Por exemplo:

Trecho do código TestMetaMultiTrack.h onde o sinal done() é emitido quando todas as faixas chamam a classe NotifyObservers pelo menos uma vez

Como a ThreadWeaver gerencia suas tarefas?

Em geral, as tarefas são executadas na ordem em que estão enfileiradas, se não tiverem pendências não resolvidas (fila de espera). Esse comportamento da ThreadWeaver é usado para gerenciar a carga de E/S (entrada/saída), rede e CPU

Um job somente ira executar se todos os jobs que ele depende estiverem finalizados. Assim, as dependências podem mudar a ordem de execução dos jobs. Se não há dependências declaradas, os jobs são executados na ordem de fila normal.

É possível que existam múltiplas dependências para um job, assim, grafos de execução complexos são criados e executados automaticamente pelo Weaver.

Para evitar dependências circulares, ou seja, quando um job A depende de um job B e o job B depende do job A, esses jobs simplesmente nunca serão executados, enquanto a dependência não for resolvida.

Existem também WeaverObservers na biblioteca, que são usados para receber informações sobre os estados das threads e de execuções de jobs.

Códigos

A maioria dos trechos código fonte do Amarok usam a implementação em C++ orientado a objetos, havendo ainda trechos em Python e alguns makefiles. O código fonte do Amarok está disponível em https://github.com/KDE/amarok/