Взгляните на библиотеку BASS www.un4seen.com
BASS бесплатно для некоммерческого использования.
Платформы: Win32, OSX, Linux
BASS также доступен для платформ Win64, WinCE, iOS, Android и ARM Linux.
BASS - аудио библиотека для использования в программном обеспечении на нескольких платформах. это
цель состоит в том, чтобы предоставить разработчикам мощный и эффективный образец,
Поток (MP3, MP2, MP1, OGG, WAV, AIFF, пользовательский и многое другое через
OS кодеки и дополнения), MOD музыка (XM, IT, S3M, MOD, MTM, UMX), MO3
музыка (MP3 / OGG сжатые моды) и функции записи. Все в
компактная DLL / LIB, которая не раздувает ваш дистрибутив.
BASS поддерживает множество дополнений, прост в использовании, гибок, имеет хорошую документацию / примеры и лучшую поддержку, которую я когда-либо видел.
Как вам нравится:
Пользовательские образцы
А также WAV / AIFF / MP3 / MP2 / MP1 / OGG
Пример: создать образец синусоидальной волны 440 Гц.
HSAMPLE sample=BASS_SampleCreate(256, 28160, 1, 1,
BASS_SAMPLE_LOOP|BASS_SAMPLE_OVER_POS); // create sample
short data[128]; // data buffer
int a;
for (a=0; a<128; a++)
data[a]=(short)(32767.0*sin((double)a*6.283185/64)); // sine wave
BASS_SampleSetData(sample, data); // set the sample's data
Воспроизведение через звуковую карту
Одновременно используйте несколько звуковых карт и перемещайте каналы между ними
Пользовательский DSP
Применяйте любые эффекты в любом порядке
DSP настраивается с помощью:
HDSP BASS_ChannelSetDSP(
DWORD handle,
DSPPROC *proc,
void *user,
int priority
);
Пример: простая функция DSP для переключения левого / правого каналов стереофонического 16-битного канала.
void CALLBACK SwapDSP(HDSP handle, DWORD channel, void *buffer, DWORD length, void *user)
{
short *s=buffer;
for (; length; length-=4, s+=2) {
short temp=s[0];
s[0]=s[1];
s[1]=temp;
}
}
запись
Гибкая система записи, с поддержкой нескольких устройств и выбором входов (кодирование и трансляция WMA через дополнение и другие форматы через BASSenc)
FFT
Пример: выполните 1024 выборочных БПФ на канале и перечислите результат.
float fft[512]; // fft data buffer
BASS_ChannelGetData(channel, fft, BASS_DATA_FFT1024);
for (int a=0; a<512; a++)
printf("%d: %f\n", a, fft[a]);