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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с буфером, типы данных.  (Прочитано 5835 раз)
Hoksmur
Гость
« : Июнь 21, 2013, 10:51 »

 В продолжение этого: http://www.prog.org.ru/topic_25057_0.html
 С буфером разобрался.
Уважаемые, появились вопросы другого плана.
1) Как читать из буфера в нужном мне формате? То есть QAudioInput пишет туда 16 битные знаковые значения по двум каналам, как мне их по переменным распихать для работы?

1а) Как в коде подстраиваться под тип данных? На входе я их знаю, но.. разные функции (методы) писать?

2) Как контролировать заполненность буфера? То есть - не допустить его переполнения и опустошения. Вырабатывает ли он какие-нибудь сигналы, по которым можно запустить обработку? Если я сделаю его фиксированного размера, могу ли я при заполнении успеть "поймать" предыдущие (затираемые?) данные без потерь?


Записан
Странник
Гость
« Ответ #1 : Июнь 21, 2013, 11:27 »

В продолжение этого: http://www.prog.org.ru/topic_25057_0.html
 С буфером разобрался.
Уважаемые, появились вопросы другого плана.
1) Как читать из буфера в нужном мне формате? То есть QAudioInput пишет туда 16 битные знаковые значения по двум каналам, как мне их по переменным распихать для работы?

1а) Как в коде подстраиваться под тип данных? На входе я их знаю, но.. разные функции (методы) писать?

2) Как контролировать заполненность буфера? То есть - не допустить его переполнения и опустошения. Вырабатывает ли он какие-нибудь сигналы, по которым можно запустить обработку? Если я сделаю его фиксированного размера, могу ли я при заполнении успеть "поймать" предыдущие (затираемые?) данные без потерь?
1) не понял вопроса. из какого буфера? в каком формате? по каким переменным для какой работы?
1а) если алгоритм обработки зависит от типа входных данных, пишите разные функции. если не зависит - можете использовать наиболее общий тип данных или шаблонные функции.
2) чтобы не допустить переполнения, вам советовали использовать циклический буфер. чтобы избежать опустошения, вам нужно правильно подобрать его размер (он должен вмещать интересующий вас объем данных с некоторым запасом).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июнь 21, 2013, 11:51 »

Отчетливо заметно стремление "обязательно использовать Qt класс", впрочем не у Вас одного Улыбающийся. Однако QBuffer сам по себе не циклический, т.е. он будет непрерывно расти. Возможно стоит перекрыть readData/writeData напр так

Код
C++ (Qt)
void MyBuffer::readData( char * data, qint64 maxSize )
{
qint64 result = 0, size = qMin(MAX_BUF_SIZE - pos(), maxSize);
if (size) {
 result = QBuffer::readData(data, size);
 maxSize -= size;
 data += size;
 if (!maxSize || result < 0) return result;
}
if (maxSize) {
 seek(0);
 if (QBuffer::readData(data, maxSize) != maxSize) return -1;
 result += maxSize;
}
}
Тогда чтение из буфера будет выглядеть так
Код
C++ (Qt)
QVector <char> temp(dataSize);
buf.seek(dataPos);
buf.readData(&temp[0], dataSize);
short * tempS = (short *) &temp[0]; // если 2 байта
 
Значения dataPos и dataSize должны храниться в др месте (напр в QList), Вы сами отслеживаете и заносите туда. Также при каждом занесении нужно проверять что оказалось перетерто в кольцевом буфере и отрезать начало QList
« Последнее редактирование: Июнь 21, 2013, 11:54 от Igors » Записан
Hoksmur
Гость
« Ответ #3 : Июнь 21, 2013, 11:55 »

1) Как читать из буфера в нужном мне формате? То есть QAudioInput пишет туда 16 битные знаковые значения по двум каналам, как мне их по переменным распихать для работы?
1) не понял вопроса. из какого буфера? в каком формате? по каким переменным для какой работы?
Данные со звуковой карты попадают в буфер, там могут оказаться 8 бит отсчёты, 16 бит отсчёты, и всё это либо 1 канал, либо стерео.  Обеспокоенный В идеале - бдет только стерео 16 бит, но лучше подстраховаться.
 Я собираюсь так решать - из одного буфера перекладываю в другой, попутно анализирую данные. Как только поймал событие - начинаю с выхода второго буфера писать N отсчётов.
 Но: в это время надо лишние отсчёты со второго буфера выбрасывать,  чтобы не переполнился, но и не допускать его уменьшения меньше X секунд.
 Смотрю в сторону QDataStream, но что-то даже примеры пока не добавили понимания.

 Сигналы какие-нить генерируются QBuffer или QByteArray - кто-нибудь знает?

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июнь 21, 2013, 12:01 »

Смотрю в сторону QDataStream, но что-то даже примеры пока не добавили понимания.

 Сигналы какие-нить генерируются QBuffer или QByteArray - кто-нибудь знает?
Обычно ругают за то что не читает букварь, а тут наоборот - зарылись с головой. ищете то что и не нужно  Улыбающийся
Записан
Hoksmur
Гость
« Ответ #5 : Июнь 21, 2013, 12:10 »

Отчетливо заметно стремление "обязательно использовать Qt класс", впрочем не у Вас одного Улыбающийся. Однако QBuffer сам по себе не циклический, т.е. он будет непрерывно расти. Возможно стоит перекрыть readData/writeData напр так
...
Ну да, есть такое. Проверяю то на персоналке, а работать будет на embedded linux. Да и документация в одном месте.

А если перехватить это http://qt-project.org/doc/qt-5.0/qtcore/qiodevice.html#bytesWritten? Вроде проще, и во внутренние механизмы не лезем. Только как ловить не все события, а только от нужного буфера?
И вот ещё нашёл по другому пункту: http://doc.qt.digia.com/4.7/datastreamformat.html
 А в C++ есть union ? То есть объявляем в одном месте памяти char[2] и int, пишем побайтно а читаем целые значения? Вроде не встречал упоминаний.

2 Igors
Кольцевой буфер отложил пока - не совсем представляю, как реализовывать. Знания языка не хватает-c... 
« Последнее редактирование: Июнь 21, 2013, 12:19 от Hoksmur » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июнь 21, 2013, 12:40 »

2 Igors
Кольцевой буфер отложил пока - не совсем представляю, как реализовывать. Знания языка не хватает-c... 
А я Вам уже написал реализацию, writeData сделаете по образцу

Когда читаете вход - Вам известно какой это канал и сколько байт. Ну и складываете это в QList напр
Код
C++ (Qt)
struct Tag {
int mType;  // 8 или 16 бит
qint64 mPos; // позиция в кольевом буфере
qint64 mSize; // размер
};
QList <Tag> lstTag;
 
void SaveInput( chat * data, qint64 size, int type )
{
// добавили тег данных
CTag tag;
tag.mType = type;
tag.mPos = buffer.pos();
tag.mSize = size;
lstTag.push_back(tag);  
 
// убираем перетерые теги
while (lstTag.size() > 1) {
  if (TagIntersect(tag, lstTag[0]))
   lstTag.pop_front();
 else
   break;
}
 
// пишем в кольцевой буфер
buffer.writeData(data, size);
}
 
Записан
Hoksmur
Гость
« Ответ #7 : Июль 01, 2013, 11:56 »

 На неделю выпал, мои извинения.

Подскажите, как работает буфер? Если я правильно понял - размер ограничен 0xFFFF. То есть, если пишем в файл с использованием буфера - оно пишет, но не сразу. Файлы могут быть на порядки больше буфера. Как и когда уменьшается его размер?

 В чём вопрос: как читается начало буфера и уменьшается его размер? И как прочитать из того же буфера в тип short ?
Записан
Hoksmur
Гость
« Ответ #8 : Июль 05, 2013, 05:01 »

 Нет ответов, закрываю. Если что - лучше новый топик заведу. Непонимающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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