HowToDoIt - Как да възпроизвеждате непрекъснати аудио данни

  • DSP (15)
  • Невронни мрежи (1)
  • Цифрова аудио обработка (14)
  • Вградени системи (4)
  • FPGA (1)
  • Програмиране (11)
  • C# (4)
  • C++(7)
  • Разни (6)
  • Разпознаване на реч (1)
  • Системи за контрол на версиите (4)
  • рубрика облак

    Открихте грешка на страницата?

    Маркирайте грешката и щракнете

    Как да възпроизвеждам непрекъснати аудио данни?

    На начинаещия няма веднага да стане ясно какво точно се случва тук. Така че ще обясня. Първо, трябва да инициализирате библиотеката, като извикате функциятаPa_Initialize().

    След това трябва да получите аудио устройството, като извикате функциятаPa_GetDefaultOutputDevice().

    Ако устройството е получено без грешка, можете да продължите да го конфигурирате. За да направите това, трябва да попълните структуратаoutputParameters.

    Когато всичко това е направено, можем да преминем към най-интересната част, а именно отваряне (Pa_OpenStream(…) ) и стартиране (Pa_StartStream(…) ) на възпроизвеждащия поток.

    Вероятно на този етап не е съвсем ясно къде и къде ще предаваме нашите звукови проби. Тук всичко е просто ... Отваряйки потока чрез извикване на функциятаPa_OpenStream(…), ние предаваме на тази функция указател към функциятаpatestCallback(…), която драйверът на аудио устройството ще изтегли (нека звучи така), когато има нужда от нови данни. И така, в тази функция ще генерираме и прехвърляме нашите аудио проби към драйвера. Как да генерирате и записвате проби в левия и десния канал, можете да видите тук:

    Тук генерираме пример с функция синус от стандартната математическа библиотека. СтойносттаtimeTmp постоянно се увеличава, докато надвиши максималната стойност за себе си и отново стане нула.Каналите в буфера се подреждат един след друг за всяка проба. В този случай имаме само 2 канала, така че преместваме указателяout към буфера само 2 пъти.

    За да прекратим работата с библиотеката, трябва да затворим потока за възпроизвеждане чрез извикване на функциятаPa_CloseStream(...), след което можем да спрем работата на самата библиотека чрез извикване наPa_Terminate().

    Това всъщност е всичко, което трябва да знаете, когато работите с библиотеката"Portaudio" в началния етап!

    В заключение бих искал да кажа, че това е само пример и някои неща не е желателно да се правят в този проект, като например разпределяне или изтриване на памет във функциятаpatestCallback(…). Освен това, извършването на тромави изчисления тук също е нежелателно. По-конкретно, в нашия случай, в случая на този пример, знам, че през времето между съседните извиквания на функциятаpatestCallback(...) ние уникално успяваме да изчислим стойността за новата извадка. Ако трябва да направите по-тромави изчисления, тогава можете да използвате логиката на многонишковите приложения и, например, FIFO буфера. Но това е съвсем различна история...

    За мен остава най-важното - да изложа изходния код на проекта :). Ето го, скъпи приятели: