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

OpenAL. Воспроизведение потокового звука (2 стр)

Страницы: 1 2 3 Следующая »
#15
11:40, 25 мая 2008

1. Кури сюда: AL_GAIN
2. Ну смотря как у тебя всё это связано...мне кажется да но я не уверен. Проверь...5 сек ведь проверить...
3. Не знаю как у OpenAL, но знаю точно что у звуковушки есть...


#16
9:22, 26 мая 2008

KaronatoR
Спасибо.

1. Угу.
2. Придется :))
3. Уже вычитал и переделал немного менеджер.

#17
12:52, 18 июня 2008

Так, чтобы не засорять пишу сюда.

Нашел, наконец, звуки и начал подключать. Появились проблемы, одна из них очень важная:

1. Трехмерный звук почему-то есть толкьо в правой колонке, когда поворачиваешься ко звуку левой стороной, его вообще нет.
2. Не создается больше 2-х звуковых источников. Вот такой ужас!

#18
13:44, 18 июня 2008

C первым пунктом разобрался, я забыл преобразовать коодинаты left-hand системы в right-hand.

А вот почему генерится толкьо два источника звука - мне не понятно!

#19
14:07, 18 июня 2008

Когда подправил ориентацию, стало слышно 4 звука, еще 2 не генерируются.

А на следующий запуск не сгенерилось 3 звука. Чертовщина какая-то.

Вот что пишет:

Wed Jun 18 14:09:10 2008 Error : COALSoundResource::Play : can not generate source : Invalid Name
Wed Jun 18 14:09:10 2008 Error : COALSoundResource::Play : can not generate source : Invalid Name
Wed Jun 18 14:09:11 2008 Error : COALSoundResource::Play : can not generate source : Invalid Name
#20
16:42, 18 июня 2008

Разобрался.

Когда отыгрывался звук, я удалял источник при помощи

  // останавливаем
  alSourceStop( m_OALSource );

  // не используем больше источник звука
  alDeleteSources( 1, &m_OALSource );

Заменив на

  // останавливаем
  alSourceRewind( m_OALSource );

  // не используем больше источник звука
  alDeleteSources( 1, &m_OALSource );

Все стало работать стабильно.

#21
11:33, 19 июня 2008

Сегодня оказалось, что все равно не стабильно.

Для звука я использую следующий принцип:

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

При такой техинке (а может и не в ней дело)  у меня создается ровно 25 источников, а больше не желает (хотя отработанные удалены.

Можно ли так делать, как я пытаюсь, или надо заранее выделять место под все источники, а потом их перераспределять?

#22
16:43, 19 июня 2008

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

Осталось, по-моему, последнее. Не удается запустить играть по новой циклический потоковый звук. Я пытаюсь делать так:

bool COALOggSoundData::ReadBlock( ALuint BufID, size_t Size )
{
  // переменные
  int      current_section;
  long    TotalRet = 0, ret;
  char    *PCM;

  if( Size < 1 ) 
    return false;

  PCM = new char[Size];

  // читаем
  while( TotalRet < (long)Size ) 
  {
    ret = ov_read( &m_OggFile, PCM + TotalRet, (long)Size - TotalRet, 0, 2, 1, ¤t_section);

    // если конец файла или лимит чтения
    if( ret <= 0 )
      break;

    TotalRet += ret;
  }

  if( TotalRet > 0 )
  {
    alBufferData( BufID, m_iSoundFormat, (void *)PCM, TotalRet, m_iSoundRate );

    ALenum Error = 0;

    if( ( Error = alGetError() ) != AL_NO_ERROR )
    {
      SAFE_DELETE_ARRAY( PCM );
      return false;
    }
  }

  if( ret <= 0 )
    ov_pcm_seek( &m_OggFile, 0 );

  SAFE_DELETE_ARRAY( PCM );

  return (ret > 0);
}

Как в примерах, практически. То есть ret <= 0 определяет когда мы дошли до конца, ov_pcm_seek должна перетащить в начало файла.

Возвращаемое значение (ret > 0) приводит к остановке источника звука (снарущи функции). Затем менеджер стартует источник по новой, но функция alBufferData возвращает ошибку. Буферы не удаляются.

При этом прокручивается последний кусок. В чем дело пока не знаю, продолжаю вести борьбу.

Может что посоветуете? Что я не так сделал?

#23
10:29, 20 июня 2008

Вопрос открыт, alBufferData возвращает огибку потому что PCM нулевой при повторном считывании с начала? Что не так?

#24
13:41, 20 июня 2008

Duncon
Спасибо! Хоть и не С, но читается нормально :)))

Сравнивал свой код с примерами и твоим - основы идентичны, разница в мелочах, которые и приводят к такому результату.

Определил место ошибки, точно-точно. Это код обработки сомого источника звука. Чтение из файла у меня верное (возможно не полностью :)) )

  // все еще обрабатываем буферы
  while( Processed-- )
  {
    // получаем уже обработанный буфер
    alSourceUnqueueBuffers( m_OALSource, 1, &BufID );

    if( alGetError() != AL_NO_ERROR )
      return;

    // не обновляем не потоковые звуки
    if( !m_pSoundData->GetStreamed() )
    {
      // звук целиком отыгран
      Stop();
      return;
    }

    bRes = m_pSoundData->ReadBlock( BufID, c_sBufferSize );

    if( bRes )
    {
      // добавляем буфер в очередь
      alSourceQueueBuffers( m_OALSource, 1, &BufID);

      if( alGetError() != AL_NO_ERROR )
        return;
    }

    if( !bRes && m_iSoundType != SOUND_SOURCE_TYPE_LOOPING )
      Stop();
  }

if( !bRes && m_iSoundType != SOUND_SOURCE_TYPE_LOOPING ) Stop(); приводит к тому, что звук зажовывается в конце обработки (на слух), а технически функция

ov_read( &m_OggFile, PCM + TotalRet, (long)Size - TotalRet, 0, 2, 1, ¤t_section);

При повторном воспроизведении читает пустой PCM ( == "" ).

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

Вот сама остановка:

void COALSoundResource::Stop()
{
  m_iSoundState = SOUND_SOURCE_STOP;

  // остановить
  alSourceStop( m_OALSource );

//  if( alGetError() != AL_NO_ERROR )
//пишем лог

  // возвращаем в список свободных
  COALSoundManager::Get().m_stdvOALFreeSources.push_back( m_OALSource );
  m_OALSource = -1;
}

Видимо остановка источника приводит к такому результату ... но почему, ведь при повторном проигрывании источник новый и файл ВРОДЕ на начало вернули ov_pcm_seek?

#25
13:44, 20 июня 2008

Да, еще фигня. У меня раз на раз при запуске иногда хрипят звуки, а иногда все чисто. Бывало у кого такое или это чисто моя ошибка?

Нашел причину хрипов, это моя оплошность.

#26
15:15, 20 июня 2008

Duncon
А можешь прокомментирвоать идею. Что за критическая секция и для чего?

Кстати, может ты еще не сталкивался, но у меня такое было. Когда я в Play генерил источник (alGenSources), а потом удалял его в Stop (alDeleteSources), приложение не создавало больше 25 источников, хотя я удалял все неиспользуемые. Потом я сделал выделение источников сразу с последующим распределением и проблема ушла.

#27
16:23, 20 июня 2008

Duncon
Ссылки битые, да и с той проблемой я справился благополучно.

#28
17:46, 20 июня 2008

Duncon
Ок

#29
17:48, 20 июня 2008

Duncon
А блин. Так это не отсится чисто ко звуку :))))) Понятно.

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

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