Войти
ПрограммированиеФорумЗвук

"Правильность" воспроизведения звука в OpenAL

Страницы: 1 2 Следующая »
#0
21:34, 26 мая 2008

Начал изучать ОпенАЛ только сегодня, так что сильно не пинайте :)
Думал, что количество источников может быть неограничено, а оказалось столько, сколько поддерживает карточка.
По этому решил делать так: в начаое создаю максимальное кол-во источников, а потом при воспроизведении нахожу свободный источник, прикрепляю к нему буффер и играю.
У меня источников 32, у кого-то может быть 8. А если вдруг окажется так, что надо будет воспроизводить 34 звука одновременно (может ли такое быть не знаю :)) - что получается, у меня теряются 2 звука, а у кого-то 26? Как это обойти?


#1
17:02, 5 июля 2008

Да уж. Тоже интересует данный вопрос. У меня максимум 24 играет :( 25-й не создается

#2
9:11, 6 июля 2008

Значит у меня звуковая карта круче :)
Выход я в принципе нашел объяснять времени нет, вот примерный код. Думаю разберешься

function Play(bufferID:string; loop:boolean = false):boolean;
var x : integer;
    v : integer;
    b : integer;
    T : extended;
begin
 result:=false;

 if not FReady then exit;

 b:=GetBufferID(bufferID);
 if b = -1 then exit;

 T:=QueryTime;
 for x:=0 to pred(numSources) do begin
  if (aSources[x].currentSnd = bufferID) and ((T - aSources[x].currentRun) <= 0.01) then begin

   aSources[x].ID:=bufferID;
   alSourceStop(aSources[x].alID);
   alSourceRewind(aSources[x].alID);
   
   alSourcei(aSources[x].alID, AL_LOOPING, ord(loop));
   alSourcePlay(aSources[x].alID);
   aSources[x].currentSnd:=bufferID;
   aSources[x].currentRun:=QueryTime;
   result:=true;
   exit;

  end;
 end;


 for x:=0 to pred(numSources) do begin
  v:=0;
  alGetSourcei(aSources[x].alID, AL_SOURCE_STATE, @v);
  if (v <> AL_PLAYING) then begin
   aSources[x].ID:=bufferID;
   alSourcei(aSources[x].alID, AL_BUFFER, aBuffers[b].alID);
   alSourcei(aSources[x].alID, AL_LOOPING, ord(loop));
   alSourcePlay(aSources[x].alID);
   aSources[x].currentSnd:=bufferID;
   aSources[x].currentRun:=QueryTime;
   result:=true;
   exit;
  end;
 end;
end;
#3
10:15, 8 июля 2008

Sergio666

А каким путём ты определяешь количество поддерживаемых источников звука?

#4
11:26, 8 июля 2008

Spike
Создавай, пока не скажет, что больше нельзя.

#5
14:03, 9 июля 2008

Osiris
>Spike
>Создавай, пока не скажет, что больше нельзя.

Во-во, так и делаю :)

#6
17:31, 7 окт. 2008

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

п.с. с OpenAL я ищё не разбирался но походу использование пула будет разумнее всего

#7
21:53, 7 окт. 2008

_kai_
>п.с. с OpenAL я ищё не разбирался но походу использование пула будет разумнее всего
Если посмотришь на код, который я привел выше, то может найдешь сходство. Только мне не понятно, что такое "пул"?

#8
1:34, 8 окт. 2008

Sergio666
>Только мне не понятно, что такое "пул"?
Пул это своего рода контейнер со встроенным менеджером
Принцип: он хранит в себе два набора данных, один с использованными ресурсами(источниками) , другой со свободными, когда он получает запрос на получение нового источника, из набора свободных источников выдёргивается один, и помечается в наборе использованных...как только источник освободился и далее не нужен, передаеш его на пул-менеджер, и помечаеш его как свободный, при этом удаляя из списка использованных..., да и ещё...необязательно сразу инитить все источники, если количество свободных источников = 0 то открываем новый, в случае если уже открыто и используется максимальное количество источников, советую тогда ставить в очередь...
что конкретнее... могу посоветовать пример того же Connection Pool в java своего рода Connection это тот же источник, и при всём этом коннекшенов зачастую всегда ограниченное количество.

по повод кода...да есть небольшое сходство...

вот пример простейшего пула на java

public class ConnectionPool{
    //private static ConnectionPool instanse=null;
    private static HashSet conFree=new HashSet();
    private static HashSet conUsed=new HashSet();
    private static int count=10;

    private static Connection createConnection() throws Exception{
        Connection con;
            try{
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                con=DriverManager.getConnection("jdbc:odbc:GameDB");
            }catch(ClassNotFoundException e){
                throw new Exception("access.err", e);
            }catch(SQLException e){
                throw new Exception("access.err", e);
            }
        return con;
    }

    private ConnectionPool(){}

    public static synchronized Connection getConnection() throws Exception {
        Connection con=null;
        try {
            if((conFree.size()+conUsed.size())<count){

                if(conFree.size()==0){
                    con = createConnection(); 
                    conUsed.add(con);
                }else{
                    Iterator it=conFree.iterator();
                    con = (Connection)it.next();

                    if(con.isClosed())con = createConnection();

                    conUsed.add(con);
                    conFree.remove(con);
                }
            }
        } catch (SQLException e) {
            throw new Exception("access.err", e);
        }

        return con;
    }

    /*
    public static synchronized ConnectionPool getInstanse(){
        if(instanse==null){
            instanse=new ConnectionPool();
        }
        return instanse;
    }
    */

    public static synchronized void closeConnection(Connection con){
        if(conUsed.contains(con)){
            conFree.add(con);
            conUsed.remove(con);
        }
    }
}

P.S. на java оказываеццо есть портированный OpenAL :)

#9
15:03, 4 мар. 2009

минимум это 8?

#10
12:30, 6 мар. 2009

ToNic
>минимум это 8?
Про минимум не сказано...

#11
12:41, 6 мар. 2009

Sergio666
>прикрепляю к нему буффер и

это Source прикрепляется к Buffer

#12
14:33, 6 мар. 2009

innuendo
>это Source прикрепляется к Buffer
Ну как сказать... там ведь вызывается

alSourcei(source, AL_BUFFER, buffer)
Больше похоже на то, что буффер прикрепляется к источнику, а не наоборот. Да и по логике так правильнее: буффер с данными выводиться через источник звука.
#13
14:36, 6 мар. 2009

Sergio666
>alSourcei(source, AL_BUFFER, buffer)
>
>Больше похоже на то, что буффер прикрепляется к источнику, а не наоборот. Да и
>по логике так правильнее: буффер с данными выводиться через источник звука.

Ну ты же можешь сделать для нескольких source один buffer ...

#14
14:46, 6 мар. 2009

Да, но все-равно к каждому из source будет прикреплен один этот буффер :)

О чем мы спорим? :)))

Страницы: 1 2 Следующая »
ПрограммированиеФорумЗвук

Тема в архиве.