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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: буфер  (Прочитано 4929 раз)
Hoksmur
Гость
« : Июль 02, 2013, 08:14 »

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

Сообщений: 976



Просмотр профиля
« Ответ #1 : Июль 02, 2013, 22:56 »

Если я буду с этим же буфером работать, получив QByteArray через .add() и seek(0) потом .remove() - возможны ли какие-нибудь коллизии? По исходникам пытался посмотреть - "ниасилил".
Пытался понять о чём пост - "ниасилил".
Записан
Hoksmur
Гость
« Ответ #2 : Июль 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 ?
Записан
Hoksmur
Гость
« Ответ #3 : Июль 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;

 Может так, на словах, посоветуете?
 Принимать в буфер - принимаю, каким классом воспользоваться, чтобы буфер по прочтении данных корректно удалял прочитанные данные, и по какому сигналу (или по таймеру?) проверять наполненность буфера?
« Последнее редактирование: Июль 03, 2013, 12:30 от Hoksmur » Записан
Hoksmur
Гость
« Ответ #4 : Июль 03, 2013, 12:45 »

Как вот этот код контролирует размер буфера?

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

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

 Могу я подать на вход QDataStream данные с QAudioInput, а читать по 8 бит или по 16 бит, в зависимости от настроек?
Записан
Hoksmur
Гость
« Ответ #5 : Июль 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();
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июль 03, 2013, 14:34 »

Принимать в буфер - принимаю, каким классом воспользоваться, чтобы буфер по прочтении данных корректно удалял прочитанные данные, и по какому сигналу (или по таймеру?) проверять наполненность буфера?
Для потока IO нет понятий удаление/вставка, это надо реализовывать самому. Популярный, простой и хороший способ - кольцевой буфер, который Вам неск раз рекомендовали (но Вы почему-то отбрыкивались Улыбающийся). Можно и по-другому, напр писать "чанками". В любом случае в буфере максимум столько данных какой размер буфера - Вы же не хотите чтобы он неограниченно рос. То есть "наполненность" известна, надо только иметь ввиду что это "последние" данные
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #7 : Июль 03, 2013, 14:55 »

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

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

UPD: А по теме, что собственно непонятно?

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

UPD2: И посмотри уже примеры
« Последнее редактирование: Июль 03, 2013, 15:12 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Hoksmur
Гость
« Ответ #8 : Июль 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 или bytesWritten ? Кто из них подразумевается устройством - буфер или звуковуха?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Июль 04, 2013, 15:44 »

  Протестировал. Такой код выбирает буфер, то есть убирает использованное.
Код
C++ (Qt)
 
       bArray->remove(0, 2);
 
Убирает, но дорогой ценой, сдвигается весь буфер что может оказаться неприемлемо медленно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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