Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Hoksmur от Июль 02, 2013, 08:14



Название: буфер
Отправлено: Hoksmur от Июль 02, 2013, 08:14
 Hi, All!
Как работает буферирование? QAudioInput пишет в буфер, а QFile читает - это очевидно. Если я буду с этим же буфером работать, получив QByteArray через .add() и seek(0) потом .remove() - возможны ли какие-нибудь коллизии? По исходникам пытался посмотреть - "ниасилил".


Название: Re: буфер
Отправлено: xokc от Июль 02, 2013, 22:56
Если я буду с этим же буфером работать, получив QByteArray через .add() и seek(0) потом .remove() - возможны ли какие-нибудь коллизии? По исходникам пытался посмотреть - "ниасилил".
Пытался понять о чём пост - "ниасилил".


Название: Re: буфер
Отправлено: Hoksmur от Июль 03, 2013, 10:21
 Хорошо. Попробую по другому объяснить. Есть такой код:

Код
C++ (Qt)
   bArray = &buffer.buffer(); // get pointer to QByteArray
// ......
   audioInput = new QAudioInput(settings, reinterpret_cast<QObject*>(this));
   //audioInput->start(&outFile);
   audioInput->start( &buffer);
 

 Могу я без коллизий сделать так:
Код
C++ (Qt)
bArray->append();
bArray->remove();
 
?

 PS: Вообще-то задача прочитать данные из звуковой карты, переваривая и 8 бит, и 16 бит. Может через QDataStream ?


Название: Re: буфер
Отправлено: Hoksmur от Июль 03, 2013, 11:58
 Сделал так:
Код
C++ (Qt)
  stream = new QDataStream (&buffer); //( bArray, QIODevice::ReadWrite);
// .......
   union {  // wtf, I'd want better way
       short val;
       char ch[2];
   };
 
   ch[0] << stream->readRawData(&ch[0], 2);
   // ch[1] << stream;
   qDebug() << val;

 Может так, на словах, посоветуете?
 Принимать в буфер - принимаю, каким классом воспользоваться, чтобы буфер по прочтении данных корректно удалял прочитанные данные, и по какому сигналу (или по таймеру?) проверять наполненность буфера?


Название: Re: буфер
Отправлено: Hoksmur от Июль 03, 2013, 12:45
Как вот этот код контролирует размер буфера?

Код
C++ (Qt)
   inSignal = new QAudioInput(format, reinterpret_cast<QObject*>(this));
   inSignal->start(&outFile);

 Как буфер не переполняется?

 Могу я подать на вход QDataStream данные с QAudioInput, а читать по 8 бит или по 16 бит, в зависимости от настроек?


Название: Re: буфер
Отправлено: Hoksmur от Июль 03, 2013, 12:59
 Ниже код, который читает (по 2 раза) как надо, но что бы такое запихать в тело цикла, чтобы прочитанные значения выкидвались, то есть buffer1 и buffer2 по идее должны выдавать разный размер буфера. Или это больше к QByteArray ?
Код
C++ (Qt)
       qDebug() << "buffer1: " << buffer.size();
   union { // wtf, I'd want better way
       // short sample;
       qint16 sample;
       char ch[2];
   };
 
   for (int i=0;i<16;i++) {
 
       stream->readRawData(&ch[0], 2);
           qDebug() << sample;
 
       buffer.getChar( &ch[0]);
       buffer.getChar( &ch[1]);
           qDebug() << sample;
   }
   qDebug() << "buffer2: " << buffer.size();
 


Название: Re: буфер
Отправлено: Igors от Июль 03, 2013, 14:34
Принимать в буфер - принимаю, каким классом воспользоваться, чтобы буфер по прочтении данных корректно удалял прочитанные данные, и по какому сигналу (или по таймеру?) проверять наполненность буфера?
Для потока IO нет понятий удаление/вставка, это надо реализовывать самому. Популярный, простой и хороший способ - кольцевой буфер, который Вам неск раз рекомендовали (но Вы почему-то отбрыкивались :)). Можно и по-другому, напр писать "чанками". В любом случае в буфере максимум столько данных какой размер буфера - Вы же не хотите чтобы он неограниченно рос. То есть "наполненность" известна, надо только иметь ввиду что это "последние" данные


Название: Re: буфер
Отправлено: kuzulis от Июль 03, 2013, 14:55
ИМХО, чанками проще. Например, надо иметь два буфера (а можно и больше): пока один заполняется - другой используется.

Например в ASIO спецификации именно так и сделано - там нет никаких кольцевых буферов.

UPD: А по теме (http://qt-project.org/doc/qt-5.0/qtmultimedia/qaudioinput.html#start), что собственно непонятно?

Что ты хочешь делать с полученными данными?

UPD2: И посмотри уже примеры (http://www.trinitydesktop.org/docs/qt4/multimedia-audioinput.html)


Название: Re: буфер
Отправлено: Hoksmur от Июль 04, 2013, 10:51
  Протестировал. Такой код выбирает буфер, то есть убирает использованное.
Код
C++ (Qt)
   union { // wtf, I'd want better way
       // short sample;
       qint16 sample;
       char ch[2];
   };
 
   for (int i=0;i<16;i++) {
       buffer.getChar( &ch[0]);
       buffer.getChar( &ch[1]);
           qDebug() << sample;
       bArray->remove(0, 2);
   }
   qDebug() << "buffer2: " << buffer.size() << bArray->size();
 
На выходе:
Код:
buffer:  16000 16000 
-8
20
-33
... мыши погрызли
293
307
buffer2:  15968 15968

Буду вещать свой обработчик на сигнал, только на какой - readyRead (http://qt-project.org/doc/qt-5.0/qtcore/qiodevice.html#readyRead) или bytesWritten (http://qt-project.org/doc/qt-5.0/qtcore/qiodevice.html#readyRead) ? Кто из них подразумевается устройством - буфер или звуковуха?


Название: Re: буфер
Отправлено: Igors от Июль 04, 2013, 15:44
  Протестировал. Такой код выбирает буфер, то есть убирает использованное.
Код
C++ (Qt)
 
       bArray->remove(0, 2);
 
Убирает, но дорогой ценой, сдвигается весь буфер что может оказаться неприемлемо медленно.