LINUX.ORG.RU

Декодер вавпака на коммон лисп

 ,


0

2

Мужики, я тут написал сабж. Не особо закончен и работает пока только с lossless негибридным вариантом.

Пользоваться можно так:

Качаете либу с гитхаба https://github.com/shamazmazum/easy-audio

Собираете примеры: (asdf:load-system :easy-audio-examples)

Пробуете: (wv-examples:wv2wav «input.wv» «output.wav»)

Если в конце файла есть мусор (бывает такое), появится отладчик, но это не на что не влияет (просто выбираете любой рестарт).

Можно послушать на колонках, если ваша OS имеет OSS устройства. Качаете cl-oss: https://github.com/shamazmazum/cl-oss

Грузите cl-oss и easy-audio и этот простой плеер:

http://pastebin.com/waQ0d0K3

Ну и пускаете единственную функцию с нужным файлом

По сравнению с wvunpack, который у меня в системе, производительность проседает где-то в 2 раза. Сам по себе формат очень тупой, в отличие от flac



Последнее исправление: lisper-pipisper (всего исправлений: 1)

А почему именно декодеры звуковых форматов, для которых есть аналоги на других языках, а не векторная графика например?

ados ★★★★★
()

До чего ж полезная и удобная штука у тебя получилась.

thesis ★★★★★
()
Ответ на: комментарий от ados

NIH-синдром, лол

А вообще мне хочется плеер, который мог бы демонизироваться как mpd, но понимал бы cue-файлы (когда весь альбом записан 1 файлом + cue-файл). И хоть mpd якобы уже может такое (а вот фигли у меня в коллекции тогда этот файл так и остается файлом, а не расщепляется на треки?), я сделал свой плеер для таких целей, который как раз использует эту библиотеку (а ещё cl-oss и cue-parser)

lisper-pipisper
() автор топика
Ответ на: комментарий от ados

А почему именно декодеры звуковых форматов, для которых есть аналоги на других языках,

Аналоги требуют вызова функций на Си, что чревато утечками памяти и сложней в отладке (особенно в многопоточном приложении).

Поэтому наличие родной библиотеки — большой плюс.

а не векторная графика например?

Есть cl-cairo, cl-graphviz, cl-svg. Что надо-то?

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от lisper-pipisper

monk, забегай сюда.

Так что сказать-то? Библиотека полезная.

Было бы логично добавлить туда же енкодер.

monk ★★★★★
()
Ответ на: комментарий от Zubok

Да также примерно, раза эдак в 4 медленнее. Но когда кормишь вывод OSS, top показывает какие-то мизерные проценты по загруженности CPU, так что это пустяки ИМХО

lisper-pipisper
() автор топика
Ответ на: комментарий от Zubok

Все так же ввод-вывод?

Ну а то, функции из bitreader/bitreader.lisp (как раз ввод). Из-за этого пришлось от CLOS отказаться. Думал с помощью CLOS нормально реализовать контейнеры (вроде OGG), но фиг, пришлось делать костылями.

Вот частичный вывод sb-sprof:

Profiler sample vector full (28150 traces / 500000 samples), doubling the size

Number of samples:   34328
Sample interval:     0.001 seconds
Total sampling time: 34.328003 seconds
Number of cycles:    0
Sampled threads:
 #<SB-THREAD:THREAD "main thread" RUNNING {1002AB3903}>

           Self        Total        Cumul
  Nr  Count     %  Count     %  Count     %    Calls  Function
------------------------------------------------------------------------
   1   6809  19.8   7411  21.6   6809  19.8        -  EASY-AUDIO.BITREADER:READ-BITS
   2   5460  15.9  16193  47.2  12269  35.7        -  EASY-AUDIO.FLAC::READ-RICE-SIGNED
   3   3353   9.8   3489  10.2  15622  45.5        -  EASY-AUDIO.BITREADER:READ-BIT
   4   2161   6.3   7761  22.6  17783  51.8        -  SB-IMPL::OUTPUT-SIGNED-SHORT-FULL-BUFFERED
   5   1784   5.2   1784   5.2  19567  57.0        -  NTHCDR
   6   1536   4.5   1536   4.5  21103  61.5        -  "foreign function __sys_write"
   7   1418   4.1   1418   4.1  22521  65.6        -  SB-KERNEL:HAIRY-DATA-VECTOR-REF
   8   1356   4.0   2760   8.0  23877  69.6        -  SB-IMPL::FLUSH-INPUT-BUFFER
   9   1276   3.7   3965  11.6  25153  73.3        -  SB-IMPL::SYNCHRONIZE-STREAM-OUTPUT
  10   1271   3.7   1271   3.7  26424  77.0        -  SB-KERNEL:%SET-FILL-POINTER
  11   1249   3.6   3475  10.1  27673  80.6        -  EASY-AUDIO.UTILS:MIXCHANNELS
  12   1088   3.2  17380  50.6  28761  83.8        -  EASY-AUDIO.FLAC::READ-RESIDUAL-BODY
  13   1084   3.2   1084   3.2  29845  86.9        -  (FLET EASY-AUDIO.FLAC::LPC-PREDICTOR-8 :IN "/home/vasily/.asd/easy-audio/flac/decode.lisp")

Можно было бы ещё посмотреть, откуда NTHCDR берется, например

lisper-pipisper
() автор топика

не ты-ли аффтор морского боя на BrainFuck'е?

emulek
()
Ответ на: комментарий от monk

Если в конце файла есть мусор (бывает такое), появится отладчик, но это не на что не влияет (просто выбираете любой рестарт).

Аналоги требуют вызова функций на Си, что чревато утечками памяти и сложней в отладке (особенно в многопоточном приложении).

вот именно за это я и люблю наших борщеедов.

emulek
()
Ответ на: комментарий от emulek

вот именно за это я и люблю наших борщеедов.

А что не так? Если этот же алгоритм дёргать через FFI, то при падении Си не освободит ресурсы. А вызов отладчика легко убирается через unwind-protect (или handler-bind/handler-case), так как это обычное исключение.

monk ★★★★★
()
Ответ на: комментарий от monk

А что не так?

всё так.

Если этот же алгоритм дёргать через FFI, то при падении Си не освободит ресурсы.

с этого места можно подробнее? Какая такая магия освобождает ресурсы в общелиспе, а в сишке не освобождает?

emulek
()
Ответ на: комментарий от emulek

Какая такая магия освобождает ресурсы в общелиспе, а в сишке не освобождает

Garbage Collector. А для внешних ресурсов unwind-protect.

В сишке же при поимке exception'а состояние программы почти неопределено.

monk ★★★★★
()
Ответ на: комментарий от monk

В сишке же при поимке exception'а состояние программы почти неопределено.

Всё зависит от задачи и от программиста. GC — слишком дорогая магия, программист-сишник обязан понимать, чем он жертвует в угоду скорости. Если такая жертва неприемлема, то нужно быстро, решительно менять ЯП.

С другой стороны, компьютеры ещё не научились прогонять бесконечный цикл за 5 секунд, да и память пока не бесплатна.

emulek
()
Последнее исправление: emulek (всего исправлений: 1)
Ответ на: комментарий от lisper-pipisper

в этой теме отвёрткой закручивают гвоздь, а в той теме молотком забивают шуруп.

ИЧСХ, у всех получается! Хотя и хреново, но всё же.

emulek
()
Ответ на: комментарий от hateyoufeel

что-ты! Я тролль, лжец, и девственник. И не я начал про пароли к аккаунтам.

emulek
()
8 сентября 2015 г.

не нужно

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.