Russian Qt Forum
Ноябрь 22, 2024, 21:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSound, QThread и паралелльное воспроизведение звука  (Прочитано 6454 раз)
Codemancer
Гость
« : Сентябрь 09, 2009, 09:19 »

Всем привет! Вопрос по параллельному воспроизведению двух и более звуковых файлов.

Имеется небольшое приложение, на форме которого присутствует 3 кнопки: 1ая запускает звуковой файл 1 в первом потоке, 2ая соответственно 2ой во втором потоке, 3я прекращает воспроизведение. Оба файла должны воспроизводиться одновременно. И вот такая загвоздка - когда запускаешь приложение в одном экземпляре, щелкаешь сначала на 1ую кнопку, а потом на 2ую, то воспроизводиться будет только звук, при вязаный к последней нажатой кнопке. Но если запустить приложение в двух экземплярах и в первом нажать 1ую кнопку, а во втором 2ую, то будут воспроизводиться оба файла одновременно. Ниже приведены части кода, которые касаются этой проблемы. Там создается два потока и каждому потоку соответствует свой звуковой файл. Что можете посоветовать? Еще замечание, в тех уловиях, в которых пишется программа, недоступны средства Phonon'а

H-файл
Код:
class CScadaAlarmThread : public QThread
{
    Q_OBJECT
    ...
public:
    QSound* pAlarmSnd;      // Звуковой файл аварийной сигнализации
    CScadaAlarmThread(QObject *parent = 0);
    void run();
};

class CScadaWarningThread : public QThread
{
    Q_OBJECT
    ...
public:
    QSound* pWarningSnd;    // Звуковой файл предупредительной сигнализации
    CScadaWarningThread(QObject *parent = 0);
    void run();
};

class CScadaAlarm : public QObject
{
    Q_OBJECT
private:
    ...
    CScadaAlarmThread* pAlarmThread;
    CScadaWarningThread* pWarnThread;

public:
    CScadaAlarm();
    ~CScadaAlarm();

public slots:
    void slotReceipt();
    void slotWarningOn();
    void slotAlarmOn();

signals:
    ...
};

CPP-файл
Код:
//-----------------------------------------------
// CScadaAlarmThread class
//-----------------------------------------------
CScadaAlarmThread::CScadaAlarmThread(QObject *parent) :
        QThread(parent)
{
    pAlarmSnd = new QSound("../music/alarm.wav");
}

void CScadaAlarmThread::run()
{
    pAlarmSnd->setLoops(-1);
    pAlarmSnd->play();
}

//-----------------------------------------------
// CScadaWarningThread class
//-----------------------------------------------
CScadaWarningThread::CScadaWarningThread(QObject *parent) :
        QThread(parent)
{
    pWarningSnd = new QSound("../music/warning.wav");
}
void CScadaWarningThread::run()
{
    pWarningSnd->setLoops(-1);
    pWarningSnd->play();
   
}

//-----------------------------------------------
// CScadaAlarm class
//-----------------------------------------------
CScadaAlarm::CScadaAlarm() : QObject(), state(0)
{
    pAlarmThread = new CScadaAlarmThread();
    pWarnThread = new CScadaWarningThread();
    ...
}

CScadaAlarm::~CScadaAlarm()
{
    Q_CHECK_PTR(pWarnThread);
    Q_CHECK_PTR(pAlarmThread);

    pWarnThread->deleteLater();
    pAlarmThread->deleteLater();

}

void CScadaAlarm::slotReceipt()
{
   ...
   pWarnThread->pWarningSnd->stop();
   pAlarmThread->pAlarmSnd->stop();
}

void CScadaAlarm::slotWarningOn()
{
   ...
   pWarnThread->start();
}

void CScadaAlarm::slotAlarmOn()
{
   ...
   pAlarmThread->start();
}
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #1 : Сентябрь 22, 2009, 01:52 »

Кажись QSound в Windows, не знаю как в Linux, однопоточный и одновременно лишь один звук может играть.
Советую посмотреть в сторону сторонних звуковых библиотек.
Лучшим вариантом будет недоступен в вашем случае Phonon, может следует постараться его пристроить?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Сентябрь 22, 2009, 07:57 »

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

ЗЫ: а что за СКАДУ пишите? Любопытно очень Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Codemancer
Гость
« Ответ #3 : Сентябрь 23, 2009, 14:12 »

К сожалению, это все не под Windows. Работа идет под ОС реального времени QNX 6.4.1, на котором удалось собрать Qt 4.5.2 (без поддержки phonon'а и некоторых других вещей) и NAS (Network Audio System, стандартную для все X). Сами разработчики собрали свое творение под QNX, называется вроде QtEmbedded, но заявили, что про Phonon можно забыть.
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #4 : Сентябрь 26, 2009, 00:00 »

Codemancer, тогда для вас нет выхода как только искать стороннюю библиотеку воспроизведения звука для QNX или как-то юзать что-то доступное из апи самой системы (UNIX)
это можно будет совместить с Qt проектом, но утратиться кроссплатформенность, каторая вам наверно и не нужна Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.237 секунд. Запросов: 23.