[РЕШЕНО] Звук в Qt (как вывести звук на каналы с разной частотой)

Модератор: Модераторы разделов

Ответить
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

[РЕШЕНО] Звук в Qt

Сообщение devilr »

Доброго времени суток!
Понадобилось решение вывести звук посредством Qt. Причем так, чтобы (к примеру) на левом канале была частота 200, а на правом 400 герц.
Да, есть родной пример Qt, который может выводить звук произвольной частоты.
Но, он выдает одновременно на оба канала.
Модификация кода ничего не дает (возможно, что я просто криворукий).

Может быть кто нибудь делал подобное?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [РЕШЕНО] Звук в Qt

Сообщение NickLion »

1. Вы уверены, что не воспроизводится? 400Hz будут немного "глушить" 200Hz. Пробовали взять, к примеру, 333Hz и 400Hz?
2. Попробую чуть позже. А какой пример использовался?
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: [РЕШЕНО] Звук в Qt

Сообщение devilr »

NickLion писал(а):
16.07.2017 18:10
1. Вы уверены, что не воспроизводится? 400Hz будут немного "глушить" 200Hz. Пробовали взять, к примеру, 333Hz и 400Hz?
2. Попробую чуть позже. А какой пример использовался?

Ну, я человек простой. Я загулил слово QAudioOutput и взял пример из документации (audiooutput).
Скомпилировал. Услышал звук.
Попробовал изменить частоту. Работает.
Теперь попытался изменить код в Generator::generateData... и не получается. Т.е. звук получается просто мишированным, если предполагать, что в m_buffer каналы располагаются последовательно.
P.S. Насчет "глушить" - я делал проще. 200 и 400 герц на слух вполне различимы. Особенно, если слушать попеременно одним и вторым ухом.
А тишину (т.е. 0 и 400 герц) я бы точно различил. :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: [РЕШЕНО] Звук в Qt

Сообщение Bizdelnick »

devilr писал(а):
16.07.2017 18:19
200 и 400 герц на слух вполне различимы.

Всё же я соглашусь с NickLion, что лучше брать нерезонансные частоты.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: [РЕШЕНО] Звук в Qt

Сообщение devilr »

0 и 200 еще более различимы :)
И 200 и 400 взяты с потолка.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [РЕШЕНО] Звук в Qt

Сообщение NickLion »

У меня всё работает. Показывайте, что меняли.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: [РЕШЕНО] Звук в Qt

Сообщение devilr »

Ну я предположил, что изменив функцию generateData в классе Generator, добьюсь нужного.
Было предположение, что в m_buffer накапливаются данные синусоиды. Каналов 2, ширина данных 16 бит - получается, что вначале (допустим) в нем 2 байта значения амплитуды одного канала, затем то же самое с другим каналом.
Сделал просто (ожидая тишины в одном канале, для простоты):
Настройки в audioinput.cpp

Код: Выделить всё

    m_format.setSampleRate(DataSampleRateHz);
    m_format.setChannelCount(2);
    m_format.setSampleSize(16);
    m_format.setCodec("audio/pcm");
    m_format.setByteOrder(QAudioFormat::LittleEndian);
    m_format.setSampleType(QAudioFormat::SignedInt);

generator.cpp

Код: Выделить всё

            else if (format.sampleSize() == 16 && format.sampleType() == QAudioFormat::SignedInt)
            {
//---
                flag = !flag;
                if(flag)
                    x = 0;
//---
                qint16 value = static_cast<qint16>(x * 32767);
                if (format.byteOrder() == QAudioFormat::LittleEndian)
                    qToLittleEndian<qint16>(value, ptr);
                else
                    qToBigEndian<qint16>(value, ptr);
            }

где flag - просто флаг для включения/выключения звука. Да, говнокод, но, если заработает - можно будет переписать по-нормальному.
Не заработало...
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [РЕШЕНО] Звук в Qt

Сообщение NickLion »

Я делал так, если что:

Код: Выделить всё

        for (int i = 0; i < format.channelCount(); ++i) {
            const qreal x = qSin(2 * M_PI * (i ? sampleRate2 : sampleRate1) * qreal(sampleIndex % format.sampleRate()) / format.sampleRate());


Но попробовал сделать так, работает только один канал. Снова УМВР.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: [РЕШЕНО] Звук в Qt

Сообщение devilr »

Да, так работает!
Воистину: век живи - век учись!
Спасибо за помощь!
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Ответить