Page 1 of 2

Документация по Infinity

Posted: Sun Apr 22, 2012 2:36 pm
by Mario
За 6 лет можно было написать хотя бы простенькую документацию по Infinity - но всем похуй! (впрочем как обычно)

В настоящее время я нарыл лишь это:
Spoiler:Звуковая система Infinity содержит следующие сервисы:

Code: Select all

   SRV_GETVERSION       equ 0
   SND_CREATE_BUFF      equ 1
   SND_DESTROY_BUFF     equ 2
   SND_SETFORMAT        equ 3
   SND_GETFORMAT        equ 4
   SND_RESET            equ 5
   SND_SETPOS           equ 6
   SND_GETPOS           equ 7
   SND_SETBUFF          equ 8
   SND_OUT              equ 9
   SND_PLAY             equ 10
   SND_STOP             equ 11
   SND_SETVOLUME        equ 12
   SND_GETVOLUME        equ 13
   SND_SETPAN           equ 14
   SND_GETPAN           equ 15
   SND_GETBUFFSIZE      equ 16
   SND_GETFREESPACE     equ 17
   SND_SETTIMEBASE      equ 18
   SND_GETTIMESTAMP     equ 19
SDK содержит следующие вспомогательные библиотеки:

Code: Select all

1) init.asm
   _InitSound@4:        ;p_ver:dword
   _CreateBuffer@12:    ;format:dword,size:dword,p_str:dword
   _DestroyBuffer@4:    ;str:dword

2) setbuf.asm
   _SetBuffer@16:       ;str:dword, src:dword, offs:dword, size:dword
   _PlayBuffer@8:       ;str:dword,flags:dword

3) sndgetfmt.asm
   _GetFormat@8:        ;str:dword, p_fmt:dword

4) sndgetmvol.asm
   proc _GetMasterVol@4 stdcall, pvol:dword
   proc _GetDevInfo@8   stdcall, hSrv:dword, p_info:dword

5) sndgetpan.asm
   _GetPan@8:           ;str:dword, p_pan:dword

6) sndgetpos.asm
   _GetBufferPos@8:     ;str:dword, p_pos:dword

7) sndgetsize.asm
   _GetBufferSize@8:    ;str:dword, p_size:dword
   _GetBufferFree@8:    ;str:dword, p_free:dword

8) sndgetvol.asm
   proc _GetVolume@12   stdcall, str:dword, pleft:dword,pright:dword

9) sndout.asm
   _WaveOut@12:         ;str:dword, src:dword, size:dword

10) sndreset.asm
   _ResetBuffer@8:      ;str:dword, flags:dword

11) sndsetfmt.asm
   _SetFormat@8:        ;str:dword, fmt:dword

12) sndsetmvol.asm
   _SetMasterVol@4:     ;vol:dword

13) sndsetpan.asm
   _SetPan@8:           ;str:dword, pan:dword

14) sndsetpos.asm
   _SetBufferPos@8:     ;str:dword, offs:dword

15) sndsetvol.asm
   _SetVolume@12:       ;str:dword, lvol:dword,rvol:dword

16) stopbuf.asm
   _StopBuffer@4:       ;str:dword

17) wavhdr.asm
   proc _test_wav@4     stdcall, hdr:dword
Когда починят в очередной раз разваливающийся движок вики - я залью страничку.

Просьба ко всем владеющим информацией помочь с документацией.

Re: Документация по Infinity

Posted: Sun Apr 22, 2012 3:28 pm
by Mario
Добавил на wiki.kolibrios.org

Re: Документация по Infinity

Posted: Sun Apr 22, 2012 4:54 pm
by SoUrcerer
Вечером приду, напишу тебе в аське по поводу Инфинити. У меня есть пару простых примеров, но я не уверен насчет их лицензионной чистоты и блаблабла :) Может, на их основе получится сделать документацию.

Re: Документация по Infinity

Posted: Sun Apr 22, 2012 7:42 pm
by Serge
Так нагляднее.
Spoiler:

Code: Select all

typedef unsigned int SNDBUF;

int _stdcall  InitSound(int *version);

int _stdcall  CreateBuffer(unsigned int format,int size,SNDBUF *buf);
int _stdcall  DestroyBuffer(SNDBUF hBuff);

int _stdcall  SetFormat(SNDBUF hBuff, unsigned int format);
int _stdcall  GetFormat(SNDBUF hBuff, unsigned int *format);

int _stdcall  ResetBuffer(SNDBUF hBuff, unsigned int flags);
int _stdcall  SetBufferPos(SNDBUF hBuff, int offset);
int _stdcall  GetBufferPos(SNDBUF hBuff, int *offset);
int _stdcall  GetBufferSize(SNDBUF hBuff, int *size);
int _stdcall  GetBufferFree(SNDBUF hBuff, int *free);

int _stdcall  SetBuffer(SNDBUF hBuff,void* buff,
                        int offs, int size);
int _stdcall  WaveOut(SNDBUF hBuff,void *buff, int size);
int _stdcall  PlayBuffer(SNDBUF hBuff,unsigned int flags);
int _stdcall  StopBuffer(SNDBUF hBuff);

int _stdcall  SetVolume(SNDBUF hBuff, int left, int right);
int _stdcall  GetVolume(SNDBUF hBuff, int *left, int *right);
int _stdcall  SetPan(SNDBUF hBuff, int pan);
int _stdcall  GetPan(SNDBUF hBuff, int *pan);

int _stdcall  GetMasterVol(int* vol);
int _stdcall  SetMasterVol(int vol);

int _stdcall  SetTimeBase(SNDBUF hBuff, double base);
int _stdcall  GetTimeStamp(SNDBUF hBuff, double *stamp);
Инициализируем звук
Spoiler:

Code: Select all

#include <sound.h>

    int    err;
    int    version =-1;

    if((err = InitSound(&version)) !=0 ){
        goto epic_fail;
    };

    if( (SOUND_VERSION>(version&0xFFFF)) ||
        (SOUND_VERSION<(version >> 16))){
        goto epic_fail;
    }
Создаём звуковой буфер.
Есть три вида буферов - статические (PCM_STATIC), потоковые (PCM_OUT) и кольцевые (PCM_RING). Самый простой для программирования - потоковый. Статический буфер не сильно отличается от буфера в DirectSound. SetBuffer заполняет буфер, GetBufferPos и SetBufferPos получают и устанавливают текущую позицию в буфере. Кольцевой буфер позволяет выводить звук с минимальной задержкой. Это аналог Direct Sound буфера с событиями, поделённого на две части.
Spoiler:snd_format одна из констант вида PCM_X_Y_Z где
X- число каналов
Y- разрядность в битах на канал
Z- частота в КГц из фиксированного набора 11025Гц, 12000Гц, 16000Гц, 22050Гц, 24000Гц, 32000Гц, 44100Гц, 48000Гц
Если формат не известен заранее используется константа PCM_ALL. Окончательно формат устанавливается вызовом SetFormat.

Code: Select all

    SNDBUF hBuff;
    void* buffer; //семплы в формате snd_format
    int buffer_size; // размер буфера в байтах

    if((err = CreateBuffer(snd_format|PCM_OUT, 0, &hBuff)) != 0)
    {
        goto epic_fail;
    };
выводим звук
    WaveOut(hBuff,buffer,buffer_size);


Для статического буфера размером 1Mб
    if((err = CreateBuffer(snd_format|PCM_STATIC, 1024*1024, &hBuff)) != 0)
    {
        goto epic_fail;
    };

заполняем буфер
    int offset; // смещение от начала звукового буфера
    SetBuffer(hBuff, buffer, offset, buffer_size);

выводим звук асинхронно - функция возвращает управление немедленно
    if((err = PlayBuffer(hBuff, 0)) !=0 ){
        goto exit_whith_error;
    };
синхронно - поток блокируется пока весь буфер не будет воспроизведён
    if((err = PlayBuffer(hBuff, PLAY_SYNC)) !=0 ){
        goto exit_whith_error;
    };
Изменение параметров воспроизведения
Spoiler:SetFormat(hBuff, snd_format);
Устанавливает новый формат звукового буфера. Применимо для PCM_OUT и PCM_STATIC буферов.
SetVolume(hBuff, left, right);
Устанавливает уровень громкости для правого и левого каналов. Уровень задаётся как ослабление сигнала в сотых долях децибела в диапазоне 0 - -10000, где
0 - максимальная громкость
-10000 (-100dB) - полная тишина
SetPan(hBuff, pan);
Устанавливает баланс левого и правого каналов. Баланс задаётся в сотых долях децибела в диапазоне -10000 - 10000, где
-10000 - тишина в правом канале
10000 - тишина в левом канале
0 - нормальный баланс каналов

Re: Документация по Infinity

Posted: Sun Apr 22, 2012 7:47 pm
by Mario
Кому как! Мне лично нужно использование в ассемблерных проектах, а таковых нет. А в Сишных вы все и так замечательный междусобойчик устроили.

Re: Документация по Infinity

Posted: Sun Apr 22, 2012 8:35 pm
by Serge
Да, мы Сишники такие вредные.
Все функции библиотеки написаны ассемблере. Вставить их в любой проект дело нескольких минут.

Re: Документация по Infinity

Posted: Sun Apr 22, 2012 8:39 pm
by Mario
А ниче что последовательность их вызовов тоже надо вылавливать из Сишных исходников? Впрочем ладно забей, раз тебе даже лень на письма в личку отвечать.

Re: Документация по Infinity

Posted: Sun Apr 22, 2012 8:49 pm
by Serge
Mario
Не лень. Ты открыл тему быстрее чем я успел ответить.
За 6 лет с вопросами 2 человека обратилось. Ты третий.

Re: Документация по Infinity

Posted: Mon Apr 23, 2012 9:45 pm
by Mario
Serge
1. Откуда берется buffer_size, когда CreateBuffer с размером 0?
2. Сколько буферов может создать один поток.
3. Может ли поток создавать разные типы буферов.
4. В каких случаях следует применять виды: статические (PCM_STATIC), потоковые (PCM_OUT) и кольцевые (PCM_RING). По каким признакам выбирать вообще? (типичные примеры)
Вернее я даже представляю как работает кольцевой - там допустим музыка играет в кольце соответственно. Но чем отличаются потоковый и статический не понял.

Re: Документация по Infinity

Posted: Mon Apr 23, 2012 11:00 pm
by Serge
1. Для PCM_OUT это размер данных, которые необходимо воспроизвести. Данные должны целиком помещаться в адресное пространство приложения.
Для PCM_RING размер определяется вызовом GetBufferSize(SNDBUF hBuff, int *size);
2. На сколько хватит ОЗУ.
3. Да, хотя в этом нет необходимости.
4. Статический буфер: простая звуковая сигнализация, озвучка интерфейса и т.п. Позволяет одновременно использовать звуковые данные в разных форматах.
Потоковый буфер: различные аудиоплееры. Программа загружает большие объёмы звуковых данных из сети, накопителей или генерирует их в реальном времени.
Кольцевой буфер: игры и другие приложения с повышенными требованиями к синхронности аудио- и видеоряда.

Re: Документация по Infinity

Posted: Mon Apr 23, 2012 11:31 pm
by Mario
Т.е. для воспроизведения отдельных семплов-букв (в синтезаторе речи) мне хватит статического буфера? Или могут быть слишком большие промежутки?

Re: Документация по Infinity

Posted: Tue Apr 24, 2012 12:45 am
by Serge
Mario
В твоём случае лучше потоковый или кольцевой. Для начала проще работать с потоковым.

Re: Документация по Infinity

Posted: Tue Apr 24, 2012 12:59 am
by Mario
Serge
А что если я создам кучу буферов в памяти и буду подсовывать их при необходимости? Т.е. я так и не понял в чем принципиальное отличие статического и потокового буфера. В чем фишка? Объясни совсем уж по тупому "на пальцах".

Re: Документация по Infinity

Posted: Tue Apr 24, 2012 2:15 am
by Serge
Mario
И получишь массу проблем с синхронизацией. Звук начинает выводиться не в момент вызова PlayBuffer, а спустя некоторое время после прерывания от контроллера. Для кольцевого буфера минимальная латентость 0.085с . Для остальных ещё хуже. В результате буферы попадающие в один квант звуковой карты (4096/48000 = 0.85(3) с) начнут воспроизводиться одновременно.
Статический буфер это простая пищалка, один бип, дзинь и т.п.
Потоковый буфер похож на чёрный ящик. Ты кидаешь в него байты, он превращает их в звук. Не важно сколько их, не важно что происходит внутри, рано или поздно он их все перемелет.

Re: Документация по Infinity

Posted: Tue Apr 24, 2012 3:16 am
by Mario
Не, ну так не хорошо вообще. Мне рано или поздно не нужно. Иначе будут заикания и прочий шлак. Получается только кольцевой нужно использовать.