Board.KolibriOS.org

Official KolibriOS board
It is currently Mon May 27, 2019 2:45 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 26 posts ]  Go to page 1 2 Next
Author Message
PostPosted: Sun Apr 22, 2012 2:36 pm 
За 6 лет можно было написать хотя бы простенькую документацию по Infinity - но всем похуй! (впрочем как обычно)

В настоящее время я нарыл лишь это:
Spoiler: Show
Звуковая система Infinity содержит следующие сервисы:
Code:
   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:
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

Когда починят в очередной раз разваливающийся движок вики - я залью страничку.

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


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


Top
   
PostPosted: Sun Apr 22, 2012 4:54 pm 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Вечером приду, напишу тебе в аське по поводу Инфинити. У меня есть пару простых примеров, но я не уверен насчет их лицензионной чистоты и блаблабла :) Может, на их основе получится сделать документацию.


Top
   
PostPosted: Sun Apr 22, 2012 7:42 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Так нагляднее.
Spoiler: Show
Code:
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: Show
Code:
#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: Show
snd_format одна из констант вида PCM_X_Y_Z где
X- число каналов
Y- разрядность в битах на канал
Z- частота в КГц из фиксированного набора 11025Гц, 12000Гц, 16000Гц, 22050Гц, 24000Гц, 32000Гц, 44100Гц, 48000Гц
Если формат не известен заранее используется константа PCM_ALL. Окончательно формат устанавливается вызовом SetFormat.
Code:
    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: Show
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 - нормальный баланс каналов


Last edited by Serge on Sun Apr 22, 2012 10:48 pm, edited 6 times in total.

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


Top
   
PostPosted: Sun Apr 22, 2012 8:35 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Да, мы Сишники такие вредные.
Все функции библиотеки написаны ассемблере. Вставить их в любой проект дело нескольких минут.


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


Top
   
PostPosted: Sun Apr 22, 2012 8:49 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Mario
Не лень. Ты открыл тему быстрее чем я успел ответить.
За 6 лет с вопросами 2 человека обратилось. Ты третий.


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


Top
   
PostPosted: Mon Apr 23, 2012 11:00 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
1. Для PCM_OUT это размер данных, которые необходимо воспроизвести. Данные должны целиком помещаться в адресное пространство приложения.
Для PCM_RING размер определяется вызовом GetBufferSize(SNDBUF hBuff, int *size);
2. На сколько хватит ОЗУ.
3. Да, хотя в этом нет необходимости.
4. Статический буфер: простая звуковая сигнализация, озвучка интерфейса и т.п. Позволяет одновременно использовать звуковые данные в разных форматах.
Потоковый буфер: различные аудиоплееры. Программа загружает большие объёмы звуковых данных из сети, накопителей или генерирует их в реальном времени.
Кольцевой буфер: игры и другие приложения с повышенными требованиями к синхронности аудио- и видеоряда.


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


Top
   
PostPosted: Tue Apr 24, 2012 12:45 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Mario
В твоём случае лучше потоковый или кольцевой. Для начала проще работать с потоковым.


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


Top
   
PostPosted: Tue Apr 24, 2012 2:15 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Mario
И получишь массу проблем с синхронизацией. Звук начинает выводиться не в момент вызова PlayBuffer, а спустя некоторое время после прерывания от контроллера. Для кольцевого буфера минимальная латентость 0.085с . Для остальных ещё хуже. В результате буферы попадающие в один квант звуковой карты (4096/48000 = 0.85(3) с) начнут воспроизводиться одновременно.
Статический буфер это простая пищалка, один бип, дзинь и т.п.
Потоковый буфер похож на чёрный ящик. Ты кидаешь в него байты, он превращает их в звук. Не важно сколько их, не важно что происходит внутри, рано или поздно он их все перемелет.


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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 26 posts ]  Go to page 1 2 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited