Название: Задача обработки данных с предысторией Отправлено: Hoksmur от Июнь 19, 2013, 06:13 Подскажите, хотя бы в какую сторону смотреть.
Задача читать данные со звукового входа, ловить условие. Как только наступает - писать в файл определённый промежуток времени. Проблемы две: 1) нужно писать и предысторию события - то есть какой-то промежуток времени до его фиксации. Если ловить будет чуть позже наступления, а не в реальном времени - допустимо. 2) данные могут придти в разных форматах: если один канал 8 бит - char, если два канала 16 бит - это уже int (или short) и надо оба канала анализировать. Собственно что использовать - вроде как очередь QQueue подходит - но как контролировать размер? А то поймал событие - попытался прочитать предысторию - а она только несколько значений содержит... QVector? Ну и как обойти проблему с разными типами данных? Может ссылки какие, или литературу посоветуйте? Сильно не пинайте - C++ и Qt только осваиваю. Название: Re: Задача обработки данных с предысторией Отправлено: Bepec от Июнь 19, 2013, 06:47 2) анализировать и записывать.
По поводу очереди - пойдёт и простой цикличный буфер минуты на три - перезаписывается по мере заполнения. Название: Re: Задача обработки данных с предысторией Отправлено: Hoksmur от Июнь 19, 2013, 08:59 По поводу очереди - пойдёт и простой цикличный буфер минуты на три - перезаписывается по мере заполнения. Догадываюсь, что очень общий вопрос, но что посоветуете - использовать готовую очередь Qt (какую из них?) или самому реализовывать? И как контролировать размер буфера? У меня уже задумки делать два последовательных буфера, и при обнаружении события тупо начинать писать с выхода второго.Ещё момент - в C++ и Qt в частности - буфер и очередь разные понятия же? (Вот сейчас можно пинать. :-[ ) Можно ли прочитать из середины буфера, узнать насколько он заполнен, и т. п.? Название: Re: Задача обработки данных с предысторией Отправлено: Bepec от Июнь 19, 2013, 09:17 Так.. Я бы использовал самописный цикличный буфер, но это моё мнение.
А так всё просто - цикличный буфер на запись последних N минут. И обычный буфер для записи уже после события. Потом просто из цикличного вынимаете данные. Qt - библиотека C++. Понятия одинаковые. Название: Re: Задача обработки данных с предысторией Отправлено: Igors от Июнь 19, 2013, 09:21 Данные настолько малы (char/short) что использоать Qt контейнер (тем более такой дорогой как QQueue) нет никакого смысла. Просто циклический буфер с четным числом байт + отдельно хранить управляющие сигналы, напр их позицию в буфере
Название: Re: Задача обработки данных с предысторией Отправлено: Hoksmur от Июнь 19, 2013, 10:05 Я так понимаю, очереди на QList построены, а там только указатели к самим данным добавляются. Но отпадают в любом случае - я не смогу данные в середине брать. Если буду сам делать буфер - то на QList удобней, ИМХО.
А можно ли к QBuffer обращаться как к произвольному массиву данных? То есть, можно ли его в одном случае прочитать как int, а в другом - как short, char, в зависимости от настроек? Ещё: порылся - вроде у него можно контролировать заполненность. Есть такие методы: buff.bytesAvailable() buff.bytesToWrite() buff.waitForBytesWritten() buff.waitForReadyRead() Теперь надо это как то с потоком связать - если нет события - выкидываем с конца буфера, если поймали - сигналим второму обработчику (потоку?), что начинай писать. Если буфер не заполнен - игнорируем. А вот с потоками и перегрузкой не разобрался. Помогите, пожалуйста, или подскажите, где хорошо расписано? Название: Re: Задача обработки данных с предысторией Отправлено: Странник от Июнь 19, 2013, 10:18 Я так понимаю, очереди на QList построены, а там только указатели к самим данным добавляются. Но отпадают в любом случае - я не смогу данные в середине брать. Если буду сам делать буфер - то на QList удобней, ИМХО. QQueue наследует QList, так что все его методы доступны, это раз.А можно ли к QBuffer обращаться как к произвольному массиву данных? То есть, можно ли его в одном случае прочитать как int, а в другом - как short, char, в зависимости от настроек? Ещё: порылся - вроде у него можно контролировать заполненность. Есть такие методы: buff.bytesAvailable() buff.bytesToWrite() buff.waitForBytesWritten() buff.waitForReadyRead() Теперь надо это как то с потоком связать - если нет события - выкидываем с конца буфера, если поймали - сигналим второму обработчику (потоку?), что начинай писать. Если буфер не заполнен - игнорируем. А вот с потоками и перегрузкой не разобрался. Помогите, пожалуйста, или подскажите, где хорошо расписано? QBuffer - просто QIODevice интерфейс для QByteArray, это два. Из Qt-классов, если уж очень хочется, можете использовать тот самый QByteArray, это три. Название: Re: Задача обработки данных с предысторией Отправлено: Igors от Июнь 19, 2013, 11:02 А можно ли к QBuffer обращаться как к произвольному массиву данных? То есть, можно ли его в одном случае прочитать как int, а в другом - как short, char, в зависимости от настроек? Это можно делать адресной арифметикой, т.е. базовыми средствами языка А вот с потоками и перегрузкой не разобрался. Помогите, пожалуйста, или подскажите, где хорошо расписано? Пусть кто-то даже хочет, но что он ответит про "потоки и перегрузку"? :) Задавайте вопрос конкретнее. Название: Re: Задача обработки данных с предысторией Отправлено: Hoksmur от Июнь 19, 2013, 11:46 А можно ли к QBuffer обращаться как к произвольному массиву данных? То есть, можно ли его в одном случае прочитать как int, а в другом - как short, char, в зависимости от настроек? Это можно делать адресной арифметикой, т.е. базовыми средствами языкаМогу попросить набросать пример для чтения буфера в виде signed int? А вот с потоками и перегрузкой не разобрался. Помогите, пожалуйста, или подскажите, где хорошо расписано? Пусть кто-то даже хочет, но что он ответит про "потоки и перегрузку"? :) Задавайте вопрос конкретнее. Код: qDebug() << "Попугаев: " << i; Оператор - откуда он получает данные на вход, куда выдаёт результат? Может ли он "выбросить лишние" данные или продублировать их где-то ещё? Поток - как описывается, как обработать данные? Например, в моём случае - читать из буфера только если он более чем на половину заполнен, если нет - бездействовать. То есть то, чем C++ от C (Си) отличается. Объектную модель (класс, экземпляр, метод, свойство), хорошо ли, плохо ли, но понял. Название: Re: Задача обработки данных с предысторией Отправлено: Igors от Июнь 19, 2013, 12:07 То есть обрабатываем поток данных, а собственно << перегруженный оператор сдвига. Поток IO - это обобщенное понятие переноса данных от источника к приемнику. Судя по тому что Вы рассказали я не вижу какой-то жизненной необходимости использовать именно поток (хотя это не запрещено). Откуда и куда - просто открываете описание оператора << и видите что это обычная ф-ция. Что там написано - то и будет выполняться, напр поток вводв текста может пропускать пробелы. Оператор - откуда он получает данные на вход, куда выдаёт результат? Может ли он "выбросить лишние" данные или продублировать их где-то ещё? Поток - как описывается, как обработать данные? Например, в моём случае - читать из буфера только если он более чем на половину заполнен, если нет - бездействовать. Код Эта запись удобнее и универсальнее чем напр Код: a = file.ReadInt(); Название: Re: Задача обработки данных с предысторией Отправлено: Hoksmur от Июнь 20, 2013, 09:49 Для промежуточного результата ввел таймер, чтобы не съедать всю память (и не превысить максимально возможный размер буфера). Набросал приложение, вылетало через некоторое время после сработки таймера, поправил.
Код: void Widget::startrec() Код: // QAudioFormat settings; // Задаем формат Название: Re: Задача обработки данных с предысторией Отправлено: Hoksmur от Июнь 20, 2013, 10:00 А этот блок собирается, и даже честно пытается работать, но в панель отладки сыпет множественные сообщения
QAudioInput: IOError QIODevice::write: ReadOnly device Код: //============= test block При чём строку, где задаю режим открытия сокращал до buffer.open(QIODevice::[Read|Write]Only ); - без изменений. А с файлами - работает. UPD: Дьявол, как всегда - в мелочах: reinterpret_cast<QObject*>(this) |