Exibição rápida de forma de onda em C / C ++

Estou interessado em implementar um editor de áudio em C ou C ++ no Windows e Linux. Não consigo descobrir como exibir a forma de onda com rapidez suficiente na visualização totalmente reduzida. Não estou procurando informações sobre técnicas de buffer de quadro rápido. Esta é uma pergunta sobre algoritmos e estruturas de dados para determinar com eficiência o que exibir.

Digamos que eu queira editar um som de 5 canais, 48 KHz e 24 bits com duas horas de duração. São 5 gigabytes de dados de amostra. Quero poder diminuir o zoom de um pixel por amostra até que todos os dados da amostra fiquem visíveis de uma só vez. Quero que o aplicativo seja responsivo, mesmo em uma máquina lenta, como, por razões de argumentos, um Atom de 1 GHz. Quando digo responsivo, gostaria que as atualizações da GUI geralmente ocorressem dentro de 1/30 de segundo da entrada do usuário.

Uma implementação ingênua varreria todas as amostras em toda a forma de onda ao decidir o que renderizar para a visualização totalmente reduzida - ela precisa encontrar os valores máximo e mínimo de amostra para todas as amostras "cobertas" por cada largura de pixel da tela. Eu escrevi um aplicativo simples para testar a velocidade dessa abordagem. Testei com uma amostra de 1 hora, mono, 16 bits e 44,1 KHz no meu Xeon 2015 de 3,5 GHz. Demora 0,12 segundos. Isso é centenas de vezes muito lento.

Você pode imaginar manter um cache de dados com menos zoom, mas não consigo ver como evitar recalcular todo o cache após a maioria das inserções ou exclusões. Parece que deve haver uma maneira melhor.

Aqui está um diagrama mostrando o que eu quero alcançar:

É assim que funciona a exibição nos editores de áudio disponíveis atualmente. É provável que os usuários esperem esse comportamento. Testei com o Audacity, e funciona dessa maneira (embora também mostre algo como a média das amostras em uma cor mais clara). Ele pode lidar com inserções arbitrárias em sons grandes, aparentemente instantaneamente. Não vou ler os 75 megabytes de código fonte para descobrir como isso acontece.

EDITAR:

Várias pessoas sugeriram esquemas que envolvem apenas a consideração de um subconjunto das amostras ao mostrar a visualização reduzida. Cheguei à conclusão de que não quero fazer isso porque perde muita informação útil. Por exemplo, incluir todas as amostras é importante se você estiver procurando por uma falha no som, como um clique em uma conversão de vinil. Na pior das hipóteses, se a falha tiver apenas uma amostra, eu ainda quero garantir que ela seja mostrada na visualização totalmente reduzida.

questionAnswers(3)

yourAnswerToTheQuestion