Carregar um grande multi-exemplo de arquivos de áudio na memória para reprodução - como evitar o congelamento temporário

StackOverflow https://stackoverflow.com/questions/2373094

Pergunta

Eu estou escrevendo um aplicativo precisa usar grande áudio multi-amostras, geralmente em torno de 50 mb de tamanho.Um arquivo contém cerca de 80 indivíduo curto gravações de som, que pode ser reproduzido pelo meu aplicativo a qualquer momento.Por esta razão, todos os dados de áudio é carregado na memória para acesso rápido.

No entanto, ao carregar um desses arquivos, pode demorar muitos segundos para colocar na memória, o que significa o meu programa se temporariamente congelados.O que é uma boa maneira de evitar que isso aconteça?Ele deve ser compatível com o Windows e o mac OS X.Que congela a este : myMultiSampleClass->open(); o que tem de fazer um monte de alocação dinâmica de memória e leitura do arquivo usando ifstream.

Pensei em duas opções possíveis:

  1. Abra o arquivo e carregá-lo na memória em outro tópico, portanto meu processo de aplicação não congelar.Eu olhei para o reforço da biblioteca para fazer isso, mas precisa fazer um monte de leitura antes de eu estou pronto para implementar.Tudo o que eu precisaria fazer é chamar a função open() da thread, em seguida, destruir o thread depois.

  2. Vir acima com um esquema para ter certeza de que não é possível carregar o arquivo inteiro na memória a qualquer momento, eu só carregar na mosca, por assim dizer.O problema é que qualquer amostra pode ser acionado a qualquer momento.Eu sei que alguns outros software tem este tipo de sistema no lugar, mas eu não tenho certeza de como ele funciona.Isso depende muito do indivíduo especificações do computador, poderia grande trabalho no meu computador, mas alguém com um lento HDD/Memória pode ficar muito ruim de resultados.Uma idéia que eu tinha era a de carga x amostras de cada gravação de áudio na memória, então se eu precisar jogar, começa a reprodução dos exemplos que já existem enquanto carregando o resto do áudio na memória.

Sugestões ou críticas?Obrigado :-)

Foi útil?

Solução

Eu gosto da Solução 1 como uma primeira tentativa - simples e direta.

Se você estiver no Windows, pode fazer operações de arquivo assíncronas - O que eles chamam - Para dizer ao sistema operacional para carregar um arquivo e informar quando estiver pronto.

Outras dicas

Usar um arquivo de memória mapeada.Tempo de carregamento é inicialmente "instantâneas", e a sobrecarga de e/S serão distribuídos ao longo do tempo.

Eu acho que a melhor solução é carregar um pequeno pedaço ou amostra única de dados de ondas por vez durante a reprodução usando E/S assíncrona (como John Dibling mencionou) para um tamanho fixo de buffer de reprodução.

A estratégia será preencher o buffer de reprodução primeiro e depois reproduzir (isso adicionará uma pequena quantidade de atraso, mas garante reprodução contínua), enquanto joga o buffer, você pode preencher novamente outro buffer de reprodução em diferentes threads (sobrepostos), pelo menos você precisa Tenha dois buffer de reprodução, um para jogar e outro para recarga em segundo plano, depois trocá-lo em tempo real

Posteriormente, você pode definir o tamanho do tamanho do buffer de reprodução com base no desempenho do PC cliente (ele será trocado entre o tamanho da memória e o poder de processamento, a CPU mais rápida exigirá um buffer menor, portanto, menor atraso).

Você pode querer considerar um Produtor-Consumidor abordagem. Isso basicamente envolveu a leitura dos dados do som em um buffer usando um encadeamento e transmitindo os dados do buffer para o seu cartão de som usando outro thread.

O leitor de dados é o produtor e transmitir os dados para a placa de som é o consumidor. Você precisa de marcas de água alta e baixa, para que, se o buffer ficar cheio, o produtor para de ler e, se o buffer ficar baixo, o produtor começará a ler novamente.

Uma biblioteca de modelos de concorrência do produtor C ++
http://www.bayimage.com/code/pcpaper.html

EDITAR: Devo acrescentar que esse tipo de coisa é complicado. Se você está construindo um amostra de player, a carga no sistema varia continuamente em função de quais chaves estão sendo reproduzidas, quantos sons estão jogando de uma só vez, quanto tempo a duração de cada som é, se o pedal de sustentação está sendo pressionado, e outros fatores, como velocidade do disco rígido e buffer e quantidade de potência do processador disponível. Algumas otimizações de programação que você finalmente empregarão não serão óbvias à primeira vista.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top