Музыка
|
|
Rolover | Дата: Понедельник, 22.07.2013, 19:49 | Сообщение # 1 |
Лейтенант
Группа: Пользователи
Сообщений: 45
Статус: Offline
| Скажите пожалуйста. Музыку реально подключить или проигрывать в программах на FB, особенно интересует в играх звуковые эффекты ну и фоновая мелодия Может просто в уроках добавить???
Объяснив другому, поймешь, что понял сам.
Сообщение отредактировал Rolover - Понедельник, 22.07.2013, 19:49 |
|
| |
haav | Дата: Понедельник, 22.07.2013, 20:04 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Попробуйте скачать библиотеку FBSOUND. В архиве масса примеров.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Павел | Дата: Вторник, 23.07.2013, 11:49 | Сообщение # 3 |
Сержант
Группа: Пользователи
Сообщений: 21
Статус: Offline
| fmod и bass еще хорошие
Сообщение отредактировал Павел - Вторник, 23.07.2013, 11:49 |
|
| |
raisa | Дата: Пятница, 14.02.2014, 17:55 | Сообщение # 4 |
Рядовой
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Друзья, это мой первый выход в программистское сообщество + гуманитарное образование + возраст. Так что строго не судите... В прошлом году скачала и установила FreeBasic_BUILD024.exe – спасибо! Начала программировать – получается... вот и добралась до МУЗЫКИ... Много хорошего слышала про библиотеку FMOD – решила попробовать, но везенье закончилось! Помогите, пожалуйста, выполнить динамическую компоновку. Взяла файл из сборки ...\Compilier\examples\sound\FMOD\fmod.dll и положила в системную папку C:\Windows\System32\ По совету знакомого попыталась зарегистрировать этот файл: >regsvr32 fmod.dll Получила следующее сообщение: fmod.dll была загружена, но найти точку входа для DllRegisterServer не удалось! Зарегистрировать этот файл невозможно!
Посоветуйте: что делать?
|
|
| |
haav | Дата: Пятница, 14.02.2014, 18:20 | Сообщение # 5 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Здравствуйте raisa!
Не нужно регистрировать в системе библиотеку. Вы можете использовать библиотеку как минимум двумя способами:
1) файл fmod.dll должен находиться в папке со скомпилируемым EXE файлом вашей программы 2) Просто положить файл fmod.dll в папку C:\Windows\System32\ . В этом случае вы можете запускать EXE файл вашей программы из любого места на вашем жестком диске. То есть ваша программа найдет fmod.dll , поскольку папка C:\Windows\System32\ является глобальной для системы , именно там лежат все системные библиотеки. 3) Есть еще третий способ, но я не буду вам выкручивать мозги
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
raisa | Дата: Суббота, 15.02.2014, 12:18 | Сообщение # 6 |
Рядовой
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Уважаемый haav, затея регистрировать библиотеку пришла не случайно! Все прекрасно работает, если используется статическая компоновка... Вот обнадеживающее начало моих поисков: #Inclib "fmod.dll" ' загрузить библиотеку в память и получить идентификатор Dim As Any Ptr Library = DyLibLoad("fmod.dll") ' если библиотека не загрузилась остановить программу If Library = 0 Then Print " Failed to load the fmod.dll, abortingprogram..." Else Print " Library fmod.dll isloaded..." End If Sleep Как и следовало ожидать, программа вывела: Library fmod.dll is loaded... Дописала программу: #Inclib "fmod.dll" ' загрузить библиотеку в память и получить идентификатор Dim As Any Ptr Library = DyLibLoad("fmod.dll") Dim As Any Ptr Func ' если библиотека не загрузилась остановит программу If Library = 0 Then Print " Failed to load the fmod.dll,aborting program..." Else Print " Library fmod.dll isloaded..." End If ' получить адрес функции в библиотеке Func = DyLibSymbol(Library, "FSOUND_GetVersion") If Func = 0 Then ' если не удалось получить адрес функции Print " Could not retrieve the function address..." End If Sleep Здесь программа неожиданно вывела: Could not retrieve the function address... т.е. она не смогла получить адрес функции... Простите, но я даже не знаю, где располагается скомпилированный EXE-файл, т.е. Ваш пункт 1 выполнить не смогла - безвылазно работаю в оболочке FbEdit... И еще – как на этом сайте нужно выделять фрагменты программ?
|
|
| |
haav | Дата: Суббота, 15.02.2014, 14:55 | Сообщение # 7 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Давайте с самого простого. Для того, чтобы получить EXE файл программы, ее надо скомпилировать. Я подозреваю, что вы все программы запускали по клавише F5 или кнопке тулбара "быстрый запуск".
Что получается , когда вы нажимаете F5:
- Программа компилируется и создается EXE файл
- Запускается EXE файл программы и вы видите результат выполнения
- После того как программа отработала, EXE файл удаляется. Это нужно , чтобы не плодить много скомпилированных EXE файлов на вашем жестком диске.
То есть быстрый запуск подходит для тестирования программ.
Если вы уже дописали программу и хотите , чтобы ей пользовался кто-то другой, вам нужно ее скомпилировать в EXE файл так, чтобы он не удалился. Для этого вам нужно: - сохранить исходный текст вашей программы в любое место на диске, например на рабочий стол. Делается это прямо из редактора FbEdit . Заходите в меню "Файл" и дальше "Сохранить как" . Сохраняете его как файл с расширением .bas
- Дальше нажимаете сочетание клавиш SHIFT+CTRL+F5 . Либо в меню "Сборка" пункт "Собрать". Либо кнопкой тулбара , как на рисунке ниже. При этом обратите внимание на опцию справа, чтобы у вас было "Windows Console" . Если у вас не так, измените. Ведь вы пока наверно создаете только консольные программы.
Дальше просто заходите в ту папку , в которой вы сохранили исходный текст вашей программы .bas, там будет и скомпилируемый файл .exe (его я называю EXE файлом) с таким же именем как исходный текст (если конечно вы не наделали ошибок в программе). Если ваша программа написана без ошибок, и EXE файл появился в нужной папке , вы можете его запустить уже без редактора FbEdit и посмотреть выполнение вашей программы.
В случае с библиотеками DLL и в частности fmod.dll, вам нужно их держать рядом с EXE файлом вашей программы. Либо , если вы пока еще только тестируете вашу программу и готовый EXE файл вам пока не нужен, то положите DLL рядом с файлом, в котором написан исходный текст программы (рядом с файлом .bas) и тогда для тестов пользуетесь "Быстрым запуском" по клавише F5. Теперь что касается подключения самой библиотеки fmod.dll. Раз вы решили научиться динамическому подключению библиотеки, то должны понимать, что вам придется загружать каждую функцию вручную. В случае с fmod.dll я считаю это лишним, но уметь подключать динамически любую библиотеку нужно. Для того, чтобы это делать без ошибок, в первую очередь надо посмотреть в любом HEX редакторе , как данная функция называется в самой библиотеке dll. Устанавливаете себе любой HEX редактор на компьютер, я предпочитаю этот: http://mh-nexus.de/en/hxd/ . Дальше открываете в нем файл fmod.dll и ищете в нем название функции FSOUND_GetVersion :
Как видите, названия функций разделяются точками. Но впереди у функции FSOUND_GetVersion есть знак подчеркивания "_ " . То есть реальное название функции _FSOUND_GetVersion Именно поэтому компилятор Freebasic сообщил, что он не может найти данную функцию. Если вы передатите ему правильное название, то ошибки не будет. Ваш код должен быть примерно таким:
Код #Inclib "fmod.dll" ' загрузить библиотеку в память и получить идентификатор Dim As Any Ptr Library = DyLibLoad("fmod.dll") Dim As Any Ptr Func ' если библиотека не загрузилась остановит программу If Library = 0 Then Print " Failed to load the fmod.dll,aborting program..." Else Print " Library fmod.dll isloaded..." End If ' получить адрес функции в библиотеке Func = DylibSymbol(Library, "_FSOUND_GetVersion") If Func = 0 Then ' если не удалось получить адрес функции Print " Could not retrieve the function address..." End If Sleep Теперь что касается оформления кода на сайте, посмотрите внимательно при создании сообщения, есть теги:
Поставьте курсор в то место сообщения куда вам нужно вставить код. Нажмите на тег "Code" . На том месте , где был курсор появится рамка. Вставьте ваш код в рамку.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
raisa | Дата: Суббота, 15.02.2014, 17:16 | Сообщение # 8 |
Рядовой
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Вы настоящий Специалист и Вы правы, я использую "быстрый запуск": - Программа компилируется и создается EXE-файл. - Запускается EXE-файл программы и вижу результат выполнения. - После того как программа отработала, EXE файл удаляется. Будем считать, что занимаюсь тестированием программ и хочу научиться на примере fmod.dll подключать динамически любую библиотеку. Странно, что таким непростым способом нужно определить имя функции, которое должно быть прописано в заголовочном файле... Для меня теперь другая загвоздка – как использовать полученный адрес функции? Чуть было все не поломала... своей корявой вставкой... Код #Inclib "fmod.dll" ' загрузить библиотеку в память и получить идентификатор Dim As Any Ptr Library = DyLibLoad("fmod.dll") Dim As Any Ptr Func Dim As Single FMODver ' если библиотека не загрузилась остановит программу If Library = 0 Then Print " Failed to load thefmod.dll,aborting program..." Else Print " Library fmod.dll isloaded..." End If ' получить адрес функции в библиотеке Func = DylibSymbol(Library, "_FSOUND_GetVersion") If Func = 0 Then ' если не удалось получить адрес функции Print " Could not retrieve the function address..." Else Print " Address of the function_FSOUND_GetVersion ="; Func End If FMODver = _FSOUND_GetVersion ' <-- что писать здесь? Print " FMOD version = "; FMODver DyLibFree(Library) Sleep
|
|
| |
haav | Дата: Суббота, 15.02.2014, 18:34 | Сообщение # 9 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата Странно, что таким непростым способом нужно определить имя функции, которое должно быть прописано в заголовочном файле... Такой способ как раз для тех библиотек, для которых не написано заголовочных файлов. Понятно, что для fmod.dll они описаны. И использовать ее удобнее, подключая заголовок.
Теперь по коду:
Вы написали не совсем верно описание для указателя функции и я просмотрел сразу
В общем так не описывают указатель для функции:
Цитата Dim As Any Ptr Func
Данную функцию надо описывать так:
Код Dim Func As function() as single
Но в общем не буду парить вам мозги, вот код:
Код #Inclib "fmod.dll" ' загрузить библиотеку в память и получить идентификатор Dim As Any Ptr Library = DyLibLoad("fmod.dll") Dim Func As function() as single ' указатель на функцию Dim As Single FMODver ' если библиотека не загрузилась остановит программу If Library = 0 Then Print " Failed to load thefmod.dll,aborting program..." Else Print " Library fmod.dll isloaded..." End If ' получить адрес функции в библиотеке Func = DylibSymbol(Library, "_FSOUND_GetVersion") If Func = 0 Then ' если не удалось получить адрес функции Print " Could not retrieve the function address..." Else Print " Address of the function_FSOUND_GetVersion ="; Func End If
FMODver = Func() Print " FMOD version = "; FMODver DyLibFree(Library) Sleep
Посмотрите и сравните со своим. Да кроме того, вместо имени func во всем коде, вы можете написать то, что ближе подходит , например GetFmodVersion .
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
raisa | Дата: Суббота, 15.02.2014, 18:59 | Сообщение # 10 |
Рядовой
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Дорогой haav, Вы вернули мне веру в силу человеческого разума! Но оказалось, что у вас, у технарей заморочек не меньше, чем у гуманитариев... Ну как я могла знать, что FreeBASIC допускает такие крутые конструкции: Dim Func As function() as Single ' указатель на функцию Это нельзя понять, это нужно запомнить (из анекдота)! Теперь нужно время все это переварить. Спасибо!!!Добавлено (15.02.2014, 18:59) --------------------------------------------- Совсем забылао от радости: А что же мой Windows не хочет регистрировать этот файл? >regsvr32 fmod.dll Выдает следующее сообщение: fmod.dll была загружена, но найти точку входа для DllRegisterServer не удалось! Зарегистрировать этот файл невозможно!
|
|
| |
haav | Дата: Суббота, 15.02.2014, 19:43 | Сообщение # 11 |
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Статус: Offline
| Цитата raisa ( ) Совсем забылао от радости:А что же мой Windows не хочет регистрировать этот файл? >regsvr32 fmod.dll Выдает следующее сообщение: fmod.dll была загружена, но найти точку входа для DllRegisterServer не удалось! Зарегистрировать этот файл невозможно! Я даже не знаю как проще объяснить. В общем есть обычные DLL библиотеки, а есть специально оформленные (Com DLL сервера). В последних заложен код для регистрации в системе, а так же реализованы методы , которые могут использоваться любыми языками, поддерживающие COM (Component Object Model). Язык Freebasic не относится к таким языкам, но все таки это не значит, что такие DLL он не сможет использовать или создавать. Просто на Freebasic это будет сложнее , чем скажем в Delphi. Как вы понимаете библиотека fmod относится к первому типу, именно поэтому система не найдя модуля регистрации в этой DLL , высветила ошибку.
И кстати:
На самом деле данную запись:
Код Dim Func As function() as single Обычно называют прототипом функции. Это у FSOUND_GetVersion нет параметров. А вот скажем у функции FSOUND_PlaySound уже несколько параметров. Ее прототип будет выглядеть так:
Код Dim FmodPlaySound as Function( byval channel as integer, byval sptr as any ptr) as integer
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
raisa | Дата: Воскресенье, 16.02.2014, 13:08 | Сообщение # 12 |
Рядовой
Группа: Пользователи
Сообщений: 5
Статус: Offline
| Не знаю, как и благодарить Вас! Поняла совсем немного, но главное появилась уверенность, что ни мой Windows, ни вложенная библиотека fmod.dll – не бракованные и можно продолжать упражнения в программировании. Буду вдвойне рада, если наша беседа станет полезна и другим, уже продвинутым, пользователям. Уверена, что Вашими стараниями оно так и будет.
|
|
| |
|