FreeBasic
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

fmod - библиотека для работы со звуком

Участников: 5

Перейти вниз

fmod - библиотека для работы со звуком Empty fmod - библиотека для работы со звуком

Сообщение  Eric-S Ср Сен 17, 2008 7:28 pm

fmod это кросплатформенная библиотека для работы со звуком. Её можно свободно использовать в некомерческих проектах.

Официальный сайт:
www.fmod.org

несколько статей, правда для c, но на русском
fMODерируем игровой звук
Введение в использование звукового движка FMOD EX
Использование FMOD в звуковых играх
Запись звука с использованием функций FMOD
Звуковое насилие



установка самого последнего стабильного пакета fmodapi v41803 win32



во freebasic лежит заголовочный файл для fmod 3.7.5
инсталятор для win32
мануал отдельно в html


Вот моя очень простая утилитка, демонстрирует запись и воспроизведение звука.

Это не конечная версия, буду дорабатывать.
Возможны ошибки, на которые, большая просьба, указывать.
А ещё лучше если вы подскажите, как их исправить.

У меня, под windows xp, работает.
Нужно лишь кинуть fmod.dll

Используються устройства по умолчанию. Проверьте, выбран ли у вас нужный soundblaster и подключен ли к нему микрофон!

версия 0.05
можно выделить фрагмент.
будет сохранён выделенный фрагмент
[ - начало фрагмента
] - конец фрагмента

версия 0.04
теперь можно сохранить и считать запись из файла.
o - вывод в файл
i - получение из файла

версия 0.03
добавил ограничение на длину воспроизводимого фрагмента.

версия 0.02
добавил паузу, остановку ну и просто немного дружелюбности.

версия 0.01
клавиши:
r - запись
p воспроизведение
s - остановить
пробел - пауза / играть
эскейп - выход из проги

Код:

    ' запись и воспроизведение
' version: 0.05

#include once "fmod.bi"

declare sub ErrorQuit( byval Message as string )
declare sub tipe_help()
declare sub status_bar( byVal s as string )

const FALSE = 0
const samp_file = "sound.raw"
const record_rate = 22050 ' частота оцифровки
const record_len = 22050 * 10 ' длина записи

   dim shared samp1 as FMUSIC_MODULE ptr
dim shared channel as integer
dim shared samp_len as integer
dim shared lab1 as integer
dim shared lab2 as integer
dim shared samp_cursor as integer

' загружаем файл
sub file_in()
samp1 = FSOUND_Sample_Load (FSOUND_FREE, samp_file, FSOUND_LOADRAW or FSOUND_STEREO or FSOUND_16BITS, 0,0)
FSOUND_Sample_SetDefaults (samp1, 22050, 255, 128, 255)
samp_len = record_len
lab1 = 0
lab2 = record_len
status_bar "stop"
end sub

' вывод в файл
sub file_out()
dim ptr1 as byte ptr
dim ptr2 as byte ptr
dim len1 as uinteger
dim len2 as uinteger
FSOUND_Sample_Lock( samp1, 4*lab1, 4*(lab2 - lab1 + 1), @ptr1, @ptr2, @len1, @len2)

locate 18, 1, 0
print "(" & ptr1 & " " & ptr2 & ") (" & len1 & " " & len2 & ")"

dim ff1 as integer = freeFile

' проверочное открытие файла
' если файл был, то он будет очищен
open samp_file for output as#ff1
close #ff1


' открываем для сохранения
open samp_file for binary as #ff1
put #ff1,, ptr1[0], len1
close #ff1
FSOUND_Sample_Unlock(samp1, ptr1, ptr2, len1, len2)
end sub

' создаём новый пустой семпл
sub new_samp()
samp1 = FSOUND_Sample_Alloc( FSOUND_UNMANAGED, record_len, FSOUND_STEREO or FSOUND_16BITS , record_rate, 255, 128, 255)
if samp1 = 0 then ErrorQuit("new sample")
end sub

' приостановка воспроизведения
sub s_p_pause()
static t as byte
if t = 0 then
t = 1 ' ставим на паузу
status_bar "pause"
else
t = 0 ' снимаем с паузы
status_bar "play"
end if
FSOUND_SetPaused( channel, t)

locate 19, 1, 0
print "position = " & str(FSOUND_GetCurrentPosition ( channel ))
end sub

' воспроизведение
sub s_play()
status_bar "play"
dim samp_pos as integer

' создаём канал для воспроизведения
channel = FSOUND_PlaySound(FSOUND_FREE, samp1)

' на стартовую позицию
FSOUND_SetCurrentPosition( channel, lab1 )



' крутимся в цикле пока идёт воспроизведение
do
samp_pos = FSOUND_GetCurrentPosition( channel )

' если уже проиграли записанный сэмпл
if samp_pos >= samp_len then
FSOUND_StopSound( channel )
exit do
end if

' проверка конца выбранного фрагмента
if samp_pos >= lab2 then
FSOUND_StopSound( channel )
exit do
end if
 
 
Sleep 50

' получаем и обрабатываем нажатие клавиш
select case inkey
case chr(32) ' пауза
s_p_pause

case "s", chr(27) ' прервать
FSOUND_StopSound( channel )
' интересно, а в конце петли, тоже нужно делать StopSound?
exit do

case "p" ' ещё раз играть с начала
FSOUND_StopSound( channel )
channel = FSOUND_PlaySound(FSOUND_FREE, samp1)

case "["
lab1 = samp_pos

case "]"
lab2 = samp_pos

end select
loop   while (FSOUND_IsPlaying(channel))

status_bar "stop"
end sub

' начинаем запись
sub s_record()
status_bar "record"
   
if( FSOUND_Record_StartSample(samp1, FALSE) = 0) then
ErrorQuit("start record")
end if

' крутимся в цикле
   do
sleep 50
select case inkey
case "s", chr(27)
exit do

end select
loop while (FSOUND_Record_GetPosition() < record_len)

' запоминаем длину записанного
samp_len = FSOUND_Record_GetPosition()
lab2 = samp_len


' останавливаем запись
FSOUND_Record_Stop()
status_bar "stop"
end sub


' основная
sub main()
cls
shell "title sound micro edit"


' проверка версии библиотеки
   if( FSOUND_GetVersion() < FMOD_VERSION ) then
        ErrorQuit( "FMOD version " & FMOD_VERSION & " or greater required" )
   end if

' инициализация
   if( FSOUND_Init( 22050, 32, 0) = FALSE ) then
        ErrorQuit( "Can't initialize FMOD" )
   end if

' выбор устройства для записи
if( FSOUND_Record_SetDriver(0) = FALSE ) then
        ErrorQuit( "Can't initialize record drive" )
end if


' создать чистый сэмпл
new_samp

tipe_help
status_bar "stop"

' петля приёма и обработки нажатий клавиш
do
locate 23, 1, 0
print " - ";
sleep

select case inkey
case chr(27) ' выход
exit do

case "r" ' запись
s_record

case "p", chr(32)
s_play

case "i"
file_in

case "o" ' вывод в файл
file_out

case "["
lab1 = 0

case "]"
lab2  = samp_len

end select
loop

status_bar "exit"
if (samp1) then
FSOUND_Sample_Free(samp1)
end if
FSOUND_Close ()

end sub


main
end 0

' выход с ошибкой
sub ErrorQuit( byval Message as string )
  print "ERROR: "; Message
  FSOUND_Close
  beep
sleep
end 1
end sub


' выводим справочку по командам
sub tipe_help()
locate 5, 1, 0
print "(esc)    - exit"
print "p        - play"
print "r        - record"
rem print "s        - stop"
print "(space)  - pause / unpause"
end sub

' строка вывода статуса
sub status_bar( byVal s as string )
locate 25, 1, 0
print left( s & space(40), 40);
print left( " len = " & str(samp_len) & space(40), 40);
end sub


Последний раз редактировалось: Eric-S (Ср Сен 24, 2008 12:33 am), всего редактировалось 11 раз(а)

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 41
Откуда : Россия, Санкт-Петербург

http://eric50.narod.ru

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  ShenZN Ср Сен 17, 2008 9:27 pm

Проверил, работает Very Happy

На сколько я понял в данном примере можно только записывать и воспроизводить записанное.

Отлично, начало уже есть Very Happy

Спасибо!

ShenZN

Сообщения : 155
Дата регистрации : 2008-02-18
Откуда : Ukraine

http://lodestar-game.narod.ru

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  Eric-S Ср Сен 17, 2008 9:56 pm

ShenZN , а какую версию fmod ты брал?

Да, сейчас только запись и воспроизведение.

Я же не допёр, как сохранить wav!
Там есть пример на vb, но в нём очень много всякого разного.
Похоже, что всё нужно делать ручками. Заголовок и т.д.

Файлы тоже будут, хочу прямо сохранять в raw, (естественном виде). Если ещё с этим разберусь.

Но если кто-нибудь напишет (выдерет) функцию сохранения в wav, то я её конечноже прикручу.


Пока я тестировал (выложен уже подправленный вариант) вышло пара приколов.

Например записал я полный семпл, а потом его переписал, но не до конца.
Воспроизводилось у меня, сначала новая часть, а потом остаток старой.
Когда же я чистый остановил не дописав до конца, то у меня игралась тишина.

Другой был прикол, когда я раз пять или десять запустил плэй. И сэмпл стал одновременно играть накладываясь сам на себя.


Вот так вот, буду мучать дальше. Хочу сделать маленький простенький редактор сэмплов.

Если кто знает, где можно найти русскую документацию по api, киньте ссылочку!

Меня особенно интересует спектральный анализ, изменение скорости и тона. fmod это точно умеет .

Ещё один прикол. Шарился по документации, в поисках функции анализа спектра и генерации и ничего не нашел.

Потом открыл, чтобы найти функции сохранения в файл, но тоже ничего не нашел.
Зато нашел функции анализа спектра. я думаю, что GetSpectrum это именно она.

Потом на форуме http://sources.ru нашел тему про генерацию сигналов.
Кстати я там задал вопросик, надеюсь, что ответят
http://forum.sources.ru/index.php?act=ST&f=72&t=250342&st=0#entry2072023

Сейчас пол часа баловался с демонстрационными прогами.
там есть например GenerateTone выдаёт почти любой сигнал, синусоида, треугольный, прямоугольный и даже белый шум. Для всех можно менять частоту, кроме шума почему-то.

Ну и вообще, очень много разных прикольных звуковых эффектов. Причём, как я понимаю, многие функции небыли вообще задействованы или работали на минимуме. Но это всё очень круто.
Вот Электрик, поковыряйся, тебе должно быть это очень интересно, там реверберация, флэйнжеры, отражение и многое другое. Помню ты мучался с простым синтезом, а тут всё уже есть и даже больше.


Последний раз редактировалось: Eric-S (Пт Сен 19, 2008 11:30 am), всего редактировалось 3 раз(а)

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 41
Откуда : Россия, Санкт-Петербург

http://eric50.narod.ru

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  Eric-S Чт Сен 18, 2008 9:15 pm

Подскажите, пожалуйста, как такое понимать. В fmod.bi функция объявляеться так
Код:

declare function FSOUND_Sample_Lock alias "FSOUND_Sample_Lock" (byval sptr as FSOUND_SAMPLE ptr, byval offset as integer, byval length as integer, byval ptr1 as any ptr ptr, byval ptr2 as any ptr ptr, byval len1 as uinteger ptr, byval len2 as uinteger ptr) as byte

А в исходнике на c, вызывается так
Код:

void *ptr1, *ptr2;
unsigned int len1, len2;
FSOUND_Sample_Lock(samp1, 0, record_len, &ptr1, &ptr2, &len1, &len2);

Ну я примерно начал так
Код:

dim ptr1 as any ptr
dim ptr2 as any ptr
dim len1 as uinteger
dim len2 as uinteger
FSOUND_Sample_Lock(samp1, 0, record_len, @ptr1, @ptr2, len1, len2)

Но меня смущают все эти амперсанты. Когда они нужны, а когда нет.

Неуверен, но кажеться вот эта функция в справочнике


Sound::lock
Returns a pointer to the beginning of the sample data for a sound.


Syntax

FMOD_RESULT Sound::lock(
unsigned int offset,
unsigned int length,
void ** ptr1,
void ** ptr2,
unsigned int * len1,
unsigned int * len2
);

Parameters

offset Offset in bytes to the position you want to lock in the sample buffer.

length Number of bytes you want to lock in the sample buffer.

ptr1 Address of a pointer that will point to the first part of the locked data.

ptr2 Address of a pointer that will point to the second part of the locked data. This will be null if the data locked hasn't wrapped at the end of the buffer.

len1 Length of data in bytes that was locked for ptr1

len2 Length of data in bytes that was locked for ptr2. This will be 0 if the data locked hasn't wrapped at the end of the buffer.



Return Values
If the function succeeds then the return value is FMOD_OK.
If the function fails then the return value will be one of the values defined in the FMOD_RESULT enumeration.


Вот так в статье написано


Для доступа к буферу звукового образца используются функции FSOUND_Sample_Unlock () и FSOUND_Sample_Lock (). При помощи этих функций можно получить непосредственный
доступ к звуковым отсчетам (сэмплам) и сохранить их на диске стандартными средствами для работы с файлами (функции fopen (), fwrite (), fclose ()). Вот
пример такого решения:

// Открываем файл для записи
FILE *f = fopen ("recdata.dat", "wb");
// Получаем доступ к звуковым данным в буфере звукового образца
// Буфер имеет кольцевую структуру, поэтому задается двумя указателями.
void *ptr1, *ptr2;
unsigned int len1, len2;
FSOUND_Sample_Lock(samp1, 0, rec_len, ptr1, ptr2, len1, len2);
fwrite(ptr1, len1, 1, f);
if (len2) fwrite(ptr2, len2, 1, f);
FSOUND_Sample_Unlock(samp1, ptr1, ptr2, len1, len2);
fclose(f);


Я написал функцию, но её вышибает. Однозначно напутал с указателями.
Код:


' выходной файл
sub file_out()
dim ptr1 as any ptr
dim ptr2 as any ptr
dim len1 as uinteger
dim len2 as uinteger
FSOUND_Sample_Lock(samp1, 0, record_len, @ptr1, @ptr2, len1, len2)

dim ff1 as integer = freeFile
open "samp.raf" for binary as #ff1
put #ff1, 1, ptr1, len1
close #ff1

FSOUND_Sample_Unlock(samp1, ptr1, ptr2, len1, len2)
end sub

Подскажите, если знаете, в чём трабла.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 41
Откуда : Россия, Санкт-Петербург

http://eric50.narod.ru

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  tux Пт Сен 19, 2008 1:38 pm

Код:
void *ptr1, *ptr2;
unsigned int len1, len2;
FSOUND_Sample_Lock(samp1, 0, record_len, &ptr1, &ptr2, &len1, &len2);
тут полюбому косяк, тк ptr1 (ну и ptr2) указатели, далее попытка передать значение &ptr1 по адресу этого указателя, но его нет (те он равен нулю), следовательно до вызова функци этим указателям должен присвоится чейто адрес (или выделится память и присвоиться адрес этой памяти)
tux
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 36
Откуда : Сибирь

http://tux.nsk.ru/

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  Eric-S Пт Сен 19, 2008 6:03 pm

Эта функция должна, как раз, и заполнить (вернуть) два указателя и две длины.
Которые как раз и нужно использовать для того, чтобы сохранить в файл нужный фрагмент сэмпла.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 41
Откуда : Россия, Санкт-Петербург

http://eric50.narod.ru

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  tux Пт Сен 19, 2008 7:03 pm

ну тада и надо передовать указатели, в которые помещать адрес данных, а не сами данные (которые не существуют)
тут какраз так и делается
void *ptr1, *ptr2;
unsigned int len1, len2;
FSOUND_Sample_Lock(samp1, 0, rec_len, ptr1, ptr2, len1, len2);
tux
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 36
Откуда : Сибирь

http://tux.nsk.ru/

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  Eric-S Вс Сен 21, 2008 8:08 am

И опять были заморочки с указателем. Я их решил и поспешил выложить новую версию.

Хочу отметить, что есть проблемы связанные со временем записи. Я её заметил, но ещё не решал.

клавиша "o" сохраняет в выходной файл.
а клавиша "i" загружает из файла.

Имя файла опятьже жостко вбито. Но по любому запись и чтение имеються, что и требовалось.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 41
Откуда : Россия, Санкт-Петербург

http://eric50.narod.ru

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty fmod - библиотека для работы со звуком

Сообщение  electrik Вт Сен 23, 2008 5:33 pm

привет. ты eric говорил про всякие эффекты fmod. да я знаю про это, генерация прямоугольного, и пилообразного звука там есть, а вот эффекты флэнжера, особенно реверба, Fmod использует eax, встроенный в звуковые карты типа creative. соответственно пропадает универсальность программы, а мне нужен был именно алгоритм реверба, низкочастотного фильтра. пример твоей проги посмотрел. но все же как будет не лень, сделаю записывалку через winmm.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  Eric-S Вт Сен 23, 2008 10:23 pm

Обновил прогу, даже версию не стал менять, поскольку исправил пару символов.
Но это изменение стало крайне существенным, т.к. теперь сохраняються и загружаються все 10 сек записи, а не 2.5 сек, как это было раньше.

Electrik, спасибо за подсказку на счёт заголовков wav, я посмотрю и займусь сохранением в него.

Про эфекты, я так понял, что библиотека делает это сама. А в том случае если ресурсы карты свободны, то она передаёт операцию на аппаратную обработку.
Впрочем меня это не очень-то интересует.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 41
Откуда : Россия, Санкт-Петербург

http://eric50.narod.ru

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  Eric-S Ср Сен 24, 2008 12:37 am

И ещё одно обновление. Реализовал выделение и сохранение фрагмента.
при воспроизведении нужно нажать левую квадратную скобочку "[" чтобы пометить начало фрагмента.
И правую квадратную скобочку "]" чтобы поставить метку конца фрагмента.
Теперь буду заморачиваться с курсором.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 41
Откуда : Россия, Санкт-Петербург

http://eric50.narod.ru

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  Eric-S Вт Окт 28, 2008 1:15 pm

Писал игрушку. Немного извращался со звуком.
Это не высший пилотаж, но есть интересные моменты. А в моей игре все потребности были удовлетворены. Посему код нельзя считать бесполезным.

Код:


#include "fmod.bi"


' указатели на загруженные сэмплы
redim shared samples(0) as FMUSIC_MODULE ptr

' канал для дополнительных звуков
dim shared channel_more as integer


' проверка версии библиотеки
   if( FSOUND_GetVersion() < FMOD_VERSION ) then
print "FMOD version " & FMOD_VERSION & " or greater required"
end
   end if

FSOUND_SetOutput(FSOUND_OUTPUT_dsound)


' инициализация
   if( FSOUND_Init( 44100, 32, 0) = 0 ) then
print "Can't initialize FMOD"
end
   end if

' функция загрузки сэмпла
function load_sample_file( byVal samp_file as string ) as integer
static sample_num as integer = 0
sample_num += 1

' растягиваем массив указателей
redim preserve samples(1 to sample_num)  as FMUSIC_MODULE ptr

' загружаем
samples(sample_num) = FSOUND_Sample_Load(FSOUND_FREE, "sound/" & samp_file & ".ogg", FSOUND_HW2D, 0, 0)
if samples(sample_num) = 0 then
cls
print "error loading sample"
print "code: " & FSOUND_GetError
print chr(34) & "sound/" & samp_file & ".ogg" & chr(34)
sleep
end 1
end if

' возвращаем индекс
function = sample_num
end function

' выгрузка сэмплов
sub unload_samples()
dim i as integer

' высвобождаем и закрываем
for i = 1 to ubound(samples)
if samples(i) then
FSOUND_Sample_Free(samples(i))
end if
next

' закрываем fsound
FSOUND_Close ()
end sub

' проиграть сэмпл
function Play_sample( byval samp as integer, byVal flag1 as integer = 0 ) as integer

' создаем новый канал для воспроизведения звука
dim channel as integer
channel = FSOUND_PlaySoundEx(FSOUND_FREE, samples(samp), 0, 1)

' снимаем звук с паузы
FSOUND_SetPaused(channel, 0)

' крутимся в цикле пока идёт воспроизведение
if flag1 = 0 then
do
Sleep 50
loop   while (FSOUND_IsPlaying(channel))
channel = 0
end if

' возвращаем номер канала
function = channel
end function



' макрос загрузки сэмпла
#Macro Load_sample(var, samp_file)
dim shared var as integer
var = load_sample_file(samp_file)
#EndMacro


например загружаем сэмпл так
Код:

Load_sample( samp_hello, "hello") ' приветствие
Так мне кажеться намного удобнее и быстрее. В данном случае именно макрос, поскольку посчитал, что возня с функцией будет слишком накладна.

Играем звук так
Код:
:
play_sample( samp_hello )
Вторым параметром можно указать режим, синхронный 0 и асинхронный 1.
Написать было чуточку проще наоборот, но данные цифорки взяты из виндовой PlaySound которая изначально была в моей игрушке.

Функция возвращает канал.
Это сделано для фоновых звуков, я писал так
Код:

channel_more = play_sample( samp_hello, 1)
И теперь могу тормознуть фоновый звук, поскольку у меня есть его канал.
Другие звуки не тормозяться!

Извращения с массивом были нужны только ради быстрой выгрузки.
unload_samples
И всё! Сэмплы выгружаються, а fmod вырубаеться.


Вот так вот весело. А, да, мой макрос был заточен именно под мою игрушку. Звуки у меня в папочке sound и расширением ogg.

Просто до невозможности. Но работает, а это главное.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 41
Откуда : Россия, Санкт-Петербург

http://eric50.narod.ru

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  Gena Ср Ноя 12, 2008 5:40 pm

Вот возник небольшой вопрос:
"FSOUND_STREAM *stream = //эдакий хендл на звуковой поток" - как это перевести на ФриБейсиковский?
И пожалуста укажите необходимые подготовления (то есть dim ы и пр.)

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 31
Откуда : Москва

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  Eric-S Сб Ноя 15, 2008 3:00 pm

Упс. Даже так и не могу сказать.
FSOUND_STREAM это тип данных, наверное так прямо и делать
dim stream1 as FSOUND_STREAM PTR
ну и далее соответственно.

Хотя для игрушки... Имхо поток не нужен. Лучше все звуки грузануть в память и оттуда их играть.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 41
Откуда : Россия, Санкт-Петербург

http://eric50.narod.ru

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  Gena Сб Ноя 15, 2008 6:24 pm

Так. Вот мучаю я ФриБейсик: примерно переводил с си, но не играет.
Код:
#include once "fmod.bi"
Const FALSE = 0
Dim As single Ps, vl
Dim samp1 as FSOUND_SAMPLE ptr ,channel1 As Integer
'Print FSOUND_SetMinHardwareChannels
if FSOUND_GetVersion() < FMOD_VERSION Then End
FSOUND_SetOutput FSOUND_OUTPUT_DSOUND
FSOUND_SetDriver 0
FSOUND_SetMixer FSOUND_MIXER_AUTODETECT
FSOUND_Init 22050, 32, 0
samp1 = FSOUND_Sample_Load(FSOUND_FREE, "zap.wav", FSOUND_HW3D, 0,10)
FSOUND_Sample_SetMode samp1, FSOUND_LOOP_NORMAL
'PsQ = 10
'vlQ = 0
channel1 = FSOUND_PlaySoundEx(FSOUND_FREE, samp1, 0,-1)
ps = 10
vl = -10
FSOUND_3D_SetAttributes channel1, @ps, @vl
FSOUND_Update
FSOUND_SetPaused channel1, FALSE
Print "end"
Укажите пожалуста на мои ошибки.

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 31
Откуда : Москва

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  Gena Ср Ноя 19, 2008 5:42 pm

Пожалуста, обратите внимание на предыдущий пост - для меня это очень важно.

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 31
Откуда : Москва

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  tux Чт Ноя 20, 2008 1:18 pm

выложи Сишный код, с которого переводил
tux
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 36
Откуда : Сибирь

http://tux.nsk.ru/

Вернуться к началу Перейти вниз

fmod - библиотека для работы со звуком Empty Re: fmod - библиотека для работы со звуком

Сообщение  Gena Чт Ноя 20, 2008 9:03 pm

Код:
FSOUND_SAMPLE *samp1 = NULL;
int channel1 = -1;
/* проверяем версию FMOD */
if (FSOUND_GetVersion() < FMOD_VERSION)
{
/* обработка ошибки */
return 1;
}
/* выбираем базовую звуковую систему DirectSound */
FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND);
/* выбираем звуковую карту по умолчанию */
FSOUND_SetDriver(0);
/* позволяем FMOD выбрать микшер */
FSOUND_SetMixer(FSOUND_MIXER_AUTODETECT);
/* инициализируем FMOD */
/* частота, к которой будут приводится все звуки в микшере, - 22050 Гц */
/* максимальное число программных каналов - 32 */
if (!FSOUND_Init(22050, 32, 0))
{
/* обработка ошибки */
return 1;
}
/* загружаем в память звуковой фрагмент из файла myfile.wav */
/* константа FSOUND_HW3D указывает, что необходимо включить аппаратную поддержку 3D звука */
samp1 = FSOUND_Sample_Load(FSOUND_FREE, "myfile.wav", FSOUND_HW3D, 0, 0);
if (!samp1)
{
/* обработка ошибки */
return 1;
}
/* устанавливаем циклическое воспроизведение, т.е. */
/* источник слышен всегда */
FSOUND_Sample_SetMode(samp1, FSOUND_LOOP_NORMAL);
/* указываем позицию и скорость источника */
float pos[3] = { -10.0f, -20.0f, 0.5f };
float vel[3] = { 0,0,0 };
/* создаем новый канал для воспроизведения звука */
/* сразу же приостанавливаем воспроизведение */
channel1 = FSOUND_PlaySoundEx(FSOUND_FREE, samp1, NULL, TRUE);
if (channel1 == -1)
{
/* обработка ошибки */
return 1;
}
/* помещаем источник звука в нужную точку */
FSOUND_3D_SetAttributes(channel1, pos, vel);
/* здесь может происходить изменение позиции слушателя */
. . .
/* обновляем звуковую картину */
FSOUND_Update();
/* возобновляем воспроизведение */
FSOUND_SetPaused(channel1, FALSE);
. . .
Вот код - ссылка http://www.tiflocomp.ru/games/design/sound_games/fmod_3d.php
Я с Си дела почти не имел, вот и криво перевожу.

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 31
Откуда : Москва

Вернуться к началу Перейти вниз

Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения