Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 16.07.2018, 18:46   #1
ZenBooster
Пользователь
 
Регистрация: 10.05.2018
Сообщений: 10
По умолчанию Как такое (manual wail) делается в OpenAL?

Manual wail:
http://youtu.be/z5bWbCYo0eA
Думал завести два звука - восходящую и нисходящую сирену, и воспроизводить их с нужного места в зависимости от нажатия или отжатия кнопки, но непонятно, как воспроизводить звук с заданной позиции.
ZenBooster вне форума   Ответить с цитированием
Старый 17.07.2018, 13:12   #2
ZenBooster
Пользователь
 
Регистрация: 10.05.2018
Сообщений: 10
По умолчанию

Ну или в другом движке?
ZenBooster вне форума   Ответить с цитированием
Старый 02.10.2019, 11:22   #3
ZenBooster
Пользователь
 
Регистрация: 10.05.2018
Сообщений: 10
По умолчанию

Сделал как задумал: Сирены спецслужб под Windows.

Код:
#include "stdafx.h"
#include "cManual.h"
 
void cManual::_threadFunction()
{
    while (!is_thr_terminate)
    {
        int processed = GetProcessed();
 
        if (processed)
        {
            UnqueueBuffer(processed);
            QueueBuffer("*manual_high");
            is_thr_action = true;
        }
        Sleep(100);
    }
    is_thr_terminate = false;
};
 
cManual::cManual():
    pthr(NULL)
{
}
 
 
cManual::~cManual()
{
    Close();
}
 
bool cManual::init()
{
    mLooped = false;
    DefaultSource();
 
    bool res = manual_asc_buffer.init();
    res &= manual_desc_buffer.init();
    res &= manual_high_buffer.init();
 
    QueueBuffer("*manual_asc");
 
    return res;
}
 
ALdouble cManual::_cvt_asc2desc_ofs(ALdouble ofs) const
{
    return ((ofs * manual_desc_buffer.get_size()) / manual_asc_buffer.get_size());
}
 
ALdouble cManual::_cvt_desc2asc_ofs(ALdouble ofs) const
{
    return ((ofs * manual_asc_buffer.get_size()) / manual_desc_buffer.get_size());
}
 
void cManual::on_highlight()
{
    bool is_running = IsPlaying();
 
    if (is_running)
    {
        int processed = GetProcessed();
        UnqueueBuffer(processed);
 
        ALint ofs = GetSampleOffset();
        QueueBuffer("*manual_asc");
        QueueBuffer("*manual_high");
 
        SetSampleOffset(manual_desc_buffer.get_size() + manual_asc_buffer.get_size() - _cvt_desc2asc_ofs(ofs) - 1);
        UnqueueBuffer();
    }
    else
    {
        int processed = GetProcessed();
        if (processed)
        {
            // Если сирена стартовала и остановилась, убираем последние проигранные буфера:
            UnqueueBuffer(processed); // если поток успел подгрузить очередной manual_high, надо будет удалить 2 буфера.
                                                                             // делаем как при первом запуске:
            QueueBuffer("*manual_asc");
        }
 
        QueueBuffer("*manual_high");
        Play();
    }
    is_thr_terminate = false;
    is_thr_action = false;
    pthr = new std::thread(std::mem_fn(&cManual::_threadFunction), this);
}
 
void cManual::on_unhighlight()
{
    is_thr_terminate = true;
    pthr->join();
    delete pthr;
    pthr = NULL;
 
    QueueBuffer("*manual_desc");
    int processed = GetProcessed();
 
    if (is_thr_action)
    {
        SetSampleOffset(manual_high_buffer.get_size() * 2);
    }
    else
    {
        ALint ofs = GetSampleOffset();
        SetSampleOffset(manual_asc_buffer.get_size() + manual_high_buffer.get_size() + manual_desc_buffer.get_size() - _cvt_asc2desc_ofs(ofs));
    }
}
ZenBooster вне форума   Ответить с цитированием
Ответ

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenAL - Alut static lib как ? intmain Visual C++ 0 04.02.2013 14:46
Как это делается? Che Guevara Свободное общение 8 17.06.2012 11:39
Как это делается? Daison Свободное общение 1 10.04.2011 18:58
как делается 0creator0 Microsoft Office Excel 6 13.10.2010 15:23
Как делается анимация ? alex(21) Gamedev - cоздание игр: Unity, OpenGL, DirectX 13 21.08.2009 11:23


22:27.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.