пятница, 10 апреля 2009 г.

libbs2b + mplayer + mingw32 или борьба за наушники

Совсем недавно в Mplayer добавили поддержку libbs2b в качестве аудио-фильтра.

libbs2b, the Bauer stereophonic-to-binaural DSP library and plugins is designed to improve headphone listening of stereo audio records. Recommended for headphone prolonged listening to disable superstereo fatigue without essential distortions.
Ну приспичило меня прикрутить это дело к самодельной сборке сего плеера.
После скачивания исходников с SVN-репозитория https://bs2b.svn.sourceforge.net/svnroot/bs2b, прикручивания к этому делу libsndfile 1.0.19 (собрал с помощью pexports, dlltool и какой-то матери) и успешной сборки самой библиотеки я приступил к долгожданному конфигурированию и сборке самого Mplayer-а. В самый ответственный момент компиляция обломалась. Начал разбор ошибок.

Сначала выяснилось, что bs2btypes.h объявлены типы, которые и так есть в stdint.h. Лишние объявления удалил.

#ifndef _INT8_T_DECLARED
typedef signed char int8_t;
#endif

#ifndef _UINT8_T_DECLARED
typedef unsigned char uint8_t;
#endif

#ifndef _INT16_T_DECLARED
typedef signed short int16_t;
#endif

#ifndef _UINT16_T_DECLARED
typedef unsigned short uint16_t;
#endif

#ifndef _INT32_T_DECLARED
#if UINT_MAX == 0xffff /* 16 bit compiler */
typedef signed long int32_t;
#else /* UINT_MAX != 0xffff */ /* 32/64 bit compiler */
typedef signed int int32_t;
#endif
#endif /* !_INT32_T_DECLARED */

#ifndef _UINT32_T_DECLARED
#if UINT_MAX == 0xffff /* 16 bit compiler */
typedef unsigned long uint32_t;
#else /* UINT_MAX != 0xffff */ /* 32/64 bit compiler */
typedef unsigned int uint32_t;
#endif
#endif /* !_UINT32_T_DECLARED */
Потом выяснилось, что нигде не объвлено BS2B_CLEVELS. Покопавшись в старый релизах этой библиотеки, я нашел, что в bs2b.h надо добавить:

/* Number of crossfeed levels */
#define BS2B_CLEVELS 3
Ругань на типы и переменные прекратилась, началась ругань на параметры функций этой самой libbs2b. Правда компилятор быстро заткнулся после добавления

#include <stdint.h>
в bs2b.h.
Дальше сборка прошла нормально.
Можно сказать, что прошел боевое крещение =)