uFMOD & C++

Тема в разделе "Библиотеки и интерфейсы", создана пользователем Barracuda, 3 мар 2005.

  1. Barracuda

    Barracuda New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2003
    Сообщения:
    19
    Никак не получается скомпилить программу в Си++ исполнении =( Использую MSVC6.0.

    Взял пример из самого архива uFMOD (http://www.wasm.ru/src/4/ufmod.zip)

    Если расширение .c (test.c), то всё замечательно компилится. Но если поменять на test.cpp, то сразу же получаем:



    test.obj : error LNK2001: unresolved external symbol "void __stdcall uFMOD_SetCallbacks(void *,void *,void *,void *,void *)" (?uFMOD_SetCallbacks@@YGXPAX0000@Z)

    test.obj : error LNK2001: unresolved external symbol "int __stdcall uFMOD_PlaySong(void *)" (?uFMOD_PlaySong@@YGHPAX@Z)

    test.obj : error LNK2001: unresolved external symbol "void * __stdcall uFMOD_LoadSong(char *)" (?uFMOD_LoadSong@@YGPAXPAD@Z)

    test.obj : error LNK2001: unresolved external symbol "void __stdcall uFMOD_FreeSong(void *)" (?uFMOD_FreeSong@@YGXPAX@Z)



    Помогите, плиз, советом :)

    Заранее спасибо :)
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Barracuda

    Afaik в test.h прототипы функций надо обернуть
    Код (Text):
    1.  
    2. #ifdef __cplusplus
    3.   extern "C" {
    4. #endif
    5. ...
    6. #ifdef __cplusplus
    7.   }
    8. #endif
     
  3. Barracuda

    Barracuda New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2003
    Сообщения:
    19
    q_q

    Огромное спасибо :)

    Уже как только не колдовал с настройками линкера, а поколдовать с препроцессором не догадался :lol: Вот что значит опыт :)



    Ещё раз спасибо! :]
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    q_q

    Barracuda

    Учтём-с. Спасибо!
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Недавно попросили прикрутить uFMOD к одному прожекту. Подробно что к чему я не разбирал и исходников под руками щас нет, но запомнилось вот что:



    1. Какой-то .inc тянет пару либ из \masm32\lib\xxx. В либу прописываются полные пути и если компилер проекта, к которому она прикручивается, на другом диске, то линкер обламывается найти эти либы. Самое смешное - они напрасно тянуться. Я их вообще закомментарил и пересобрал либу - стало всё ОК.



    2. Как я понял, колбэки можно вообще не выносить из либы, т.к. я втупую взял их из примера. Т.е. если юзеру не нужен контроль над потоком, либа сама всё делает. Достаточно только LoadSong/PlaySong. Я бы сделал так: если колбэки не требуются, можно вообще не звать InitCalback или звать её так InitCalback(NULL,NULL,NULL...). Если какой-то колбэк нужен, то юзер его сам кодит и передает в InitCalback.



    3. Что-то там у вас накосячено с проверкой ошибок. То ли если InitCalback два раза позвать падает, то ли что-то ещё... не помню.
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Four-F

    Это ты давно пробовал или проблемы с последней версией что сейчас лежит на сайте?
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    > Что-то там у вас накосячено с проверкой ошибок. То ли если InitCalback два раза позвать падает, то ли что-то ещё... не помню.



    Падает что, тестовый пример или то приложение к которому ты прикручивал?



    У меня падает только в одном случае, если в win98! на Play нажать Enter и держать, тогда получается что мы заставляем прогу делать бесконечный рестарт проигрывания, после такого жестокого испытания через несколько секунд падает.
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Four-F



    Правильно. Т.к. компилируется статическая либа, то линкер вообще не вызывается и kernel32.lib + winmm.lib на этом этапе не нужны. Убрал.





    Колбэки требуются всегда :) Некоторые из них действительно были лишними и были удалены из последней версии, но те, что остались действительно нужны.





    Ну... Зачем же его 2 раза звать? :) Хотя, если вспомните что там точно было я проверю.



    Спасибо!
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Asterix



    Я тебе уже писал, что это связано с динамической памятью в недрах того исходника, что осталось перевести на асм :)



    Пора писать новый релиз...
     
  10. Barracuda

    Barracuda New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2003
    Сообщения:
    19
    Очень удачно подняли тему :)

    У меня появился ещё один вопрос к опытным людям :)

    После добаления подобного кода (т.е. любого кода с вызовом функции pow):


    Код (Text):
    1.  
    2. double power(double x, double y)
    3. {
    4.     return pow(x, y);
    5. }
    6.  




    получаю ошибку:


    Код (Text):
    1.  
    2. LIBC.lib(fpinit.obj) : error LNK2005: __fltused already defined in uFMOD.lib(music_formatxm.obj)
    3. Release/test.exe : fatal error LNK1169: one or more multiply defined symbols found
    4.  




    :dntknw:



    Как можно устранить подобную неприятность? :)



    P.S. Quantum & Asterix

    Огромное спасибо за uFMOD :lol:
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Barracuda

    Внутри music_formatxm.c есть такая строчка:
    Код (Text):
    1. extern int _fltused = 0; // disable FPU CRT


    Это удаляет из модуля какой-то код с использованием FPU, который генерирует компилятор VC. Если небольшое увеличение размера вам не помешает, можете удалить эту строчку и перекомпилировать (сначала ассемблерные модули, а потом сишные).
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Интересно, почему это примерчик загружает процессор на 100%?

    winamp же при воспроизведении этого .xm вообще не нагружает проц. :dntknw:



    Может либа кривая?
     
  13. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    cresta



    Прямо таки на 100%?





    Может.



    З.Ы. Уже исправил. Заменил Sleep(0) на Sleep(2) и максимальная загрузка упала до 0-1%.
     
  14. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ Asterix</font><!--color--><font color="gray]: Это ты давно пробовал или проблемы с последней версией что сейчас лежит на сайте? ]</font><!--color-->



    Дело было неделю назад.





    <font color="gray][ Asterix</font><!--color--><font color="gray]: Падает что, тестовый пример или то приложение к которому ты прикручивал? ]</font><!--color-->



    То к чему прикручивали. Кажись я забыл про SetCallbacks и, на то ли LoadSong, то ли PlaySong оно упало.





    <font color="gray][ Quantum</font><!--color--><font color="gray]: Колбэки требуются всегда :) ]</font><!--color-->



    Я не это имел в виду. Я хотел сказать, что колбэки можно в либу перенести, если не требуется контролировать поток. Т.е. предусмотреть вариант по-умолчанию. Вот чтоб так можно было делать.


    Код (Text):
    1. void open(void){
    2.    hRes = FindResource(0,(char*)1,(char*)RT_RCDATA);
    3.    memf.mem_length = SizeofResource(0,hRes);
    4.    memf.mem_data = LoadResource(0,hRes);
    5.    memf.mem_pos = 0;
    6. }
    7.  
    8. uFMOD_SetCallbacks( &open, NULL, NULL, NULL, NULL );
    9.  
    10. hSong = uFMOD_LoadSong(0);
    11. uFMOD_PlaySong(hSong);




    И кстати, uFMOD_LoadSong(0) как-то не логично. Надо uFMOD_LoadSong(<что-то идентифицирующее xm>). Тогда колбэк open возможно вообще не нужен.





    <font color="gray][ Quantum</font><!--color--><font color="gray]: Зачем же его 2 раза звать? :) ]</font><!--color-->



    Ну я типа про защиту от дурака.





    С _fltused у меня тоже косяк был. Прикручивалось к MFC'ишному проекту и линкер ругался, что типа есть уже такое. Автор проекта божился, что сам не юзает _fltused.





    <font color="gray][ Quantum</font><!--color--><font color="gray]: Прямо таки на 100%? ]</font><!--color-->



    Ага ;) Тот xm, что у вас в примере ещё более-менее, а то, что я из сети понатаскал на все 100%.
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Four-F

    > Я не это имел в виду. Я хотел сказать, что колбэки можно в либу перенести



    Это я сразу понял. Прям P&P какой-то получится тогда :derisive:



    > Кажись я забыл про SetCallbacks и, на то ли LoadSong, то ли PlaySong оно упало.



    Вот видишь - твоя вина оказывается :derisive:
     
  16. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Four-F



    Это в примере ноль, а вообще этот параметр как раз и предусмотрен для "<что-то идентифицирующее xm>". Это "что-то" передаётся потом в open-callback.





    А можно как в minimal:
    Код (Text):
    1. uFMOD_SetCallbacks( &tell, &tell, &read, &seek, &tell );
    Позволить передавать нули потребует ввести в код либы дополнительную логику, а это увеличит размер либы :dntknw:





    Нет, так оно работать не будет. Вызывать LoadSong без предварительного вызова SetCallbacks - это как вызывать sendto без WSAStartup :)





    Пока можно исправить так как я объяснил Barracuda, а потом, как только последний сишный исходник превратится в нормальный ассемблерный, мы уберём fltused.





    Да, это баг. Уже исправлен, но надо опять тестировать. Скоро выложим сервис пак на сайте :derisive:
     
  17. Barracuda

    Barracuda New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2003
    Сообщения:
    19
    Quantum

    Спасибо за ответ.

    Я сначала просто открыл либу WinHEX'ом и заменил fltused на другое имя :) Всё стало компилиться, но я не был уверен в правильности и надёжности такого метода :)



    Теперь же я перекомпилил либу без строчки "extern int _fltused = 0;". Такое незначительное изменение размера для меня не помеха :)
     
  18. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Quantum >




    Возможны проблемы - под NT системами Sleep(2) даёт задержку ~15мс.

    Нужно добавить timeBeginPeriod(1) - это мистическим оброзом виляет на планировщик :)



    http://www.wasm.ru/forum/index.php?action=vthread&forum=4&topic=9034&page=1
     
  19. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ Asterix</font><!--color--><font color="gray]: Прям P&P какой-то получится тогда :derisive: ]</font><!--color-->



    Точно. IMHO, так и должно быть. Я бы хотел, в идеале, иметь всего две функции: ИграйПесню и НеИграйПесню ;)





    <font color="gray][ Quantum</font><!--color--><font color="gray]: а это увеличит размер либы :dntknw: ]</font><!--color-->



    На сколько? На 38,5 байт? Ну и хрен-то с ним. А так мне колбэки в проекте определять нужно и суммарный размер остается тем же.





    <font color="gray][ Asterix</font><!--color--><font color="gray]: Вот видишь - твоя вина оказывается :derisive: ]</font><!--color-->



    Бесспорно я накосячил, но помнится был эксепшн, а должна была вернуться просто ошибка без падения кода.





    Asterix и Quantum, проджект ваш - решать вам, но я бы сделал так (по аналогии с PlaySound):


    Код (Text):
    1. uFMOD_PlaySong
    2. The uFMOD_PlaySong function plays a song specified by the given filename or resource.
    3.  
    4. BOOL uFMOD_PlaySong(
    5.   LPCSTR  pszSong,
    6.   HMODULE hmod,
    7.   DWORD   fdwSong
    8. );
    9.  
    10. Parameters:
    11.  
    12.     [i]pszSong[/i]
    13.  
    14.         A string that specifies the song to play. If this parameter is NULL,
    15.         any currently playing song is stopped.
    16.  
    17.         Two flags in fdwSong (SNG_FILENAME, and SNG_RESOURCE) determine whether
    18.         the name is interpreted as a filename or a resource identifier.
    19.  
    20.     [i]hmod[/i]
    21.  
    22.         Handle to the executable file that contains the resource to be loaded.
    23.         This parameter must be NULL unless SNG_RESOURCE is specified in fdwSong.
    24.  
    25.     [i]fdwSong[/i]
    26.  
    27.         Flags for playing the song. The following values are defined.
    28.  
    29.         Value           Meaning
    30.         SNG_FILENAME    The pszSong parameter is a filename.
    31.         SNG_LOOP        The song plays repeatedly until uFMOD_PlaySong is called again
    32.                         with the pszSong parameter set to NULL.
    33.         SNG_MEMORY      The parameter specified by pszSong points to an image
    34.                         of a song in memory.
    35.         SNG_RESOURCE    The pszSong parameter is a resource identifier;
    36.                         hmod must identify the instance that contains the resource.
    37.  
    38. Return Values
    39.  
    40.     Returns TRUE if successful or FALSE otherwise.
    41.  






    Тогда всё становится гениально просто:


    Код (Text):
    1. //
    2. //  Колбасимся
    3. //
    4.  
    5. uFMOD_PlaySong( IDR_VERYCOOLSONG, hInstance, SNG_RESOURCE | SNG_LOOP );
    6.  
    7.  
    8. //
    9. //  Отдыхаем
    10. //
    11.  
    12. uFMOD_PlaySong( NULL, NULL, 0 );




    Ну а если юзеру нужен контроль над потоком, то пусть он уже париться с колбэками. Размер увеличится крайне незначительно, а главное, что это увеличение будет, IMHO, оправдано.
     
  20. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    S_T_A_S_

    Очень интересный топик. В minifmod на этом месте было Sleep(5-10). БОльшие задержки приводят к понижению качества звучания. IMHO, главное - чтоб качество не падало, а не точная продолжительность задержки в микросекундах. Ещё раз спасибо за ссылку!



    Four-F



    Не доводите меня до инфаркта такими цифрами :)





    Идея, безусловно, интересная. Принята на рассмотрение.





    Это мы исправим. Пару байт добавить - ещё куда ни шло.