Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Hoksmur от Июнь 21, 2013, 10:51



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

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

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




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

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

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


Название: Re: Работа с буфером, типы данных.
Отправлено: Igors от Июнь 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


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

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



Название: Re: Работа с буфером, типы данных.
Отправлено: Igors от Июнь 21, 2013, 12:01
Смотрю в сторону QDataStream, но что-то даже примеры пока не добавили понимания.

 Сигналы какие-нить генерируются QBuffer или QByteArray - кто-нибудь знает?
Обычно ругают за то что не читает букварь, а тут наоборот - зарылись с головой. ищете то что и не нужно  :)


Название: Re: Работа с буфером, типы данных.
Отправлено: Hoksmur от Июнь 21, 2013, 12:10
Отчетливо заметно стремление "обязательно использовать Qt класс", впрочем не у Вас одного :). Однако QBuffer сам по себе не циклический, т.е. он будет непрерывно расти. Возможно стоит перекрыть readData/writeData напр так
...
Ну да, есть такое. Проверяю то на персоналке, а работать будет на embedded linux. Да и документация в одном месте.

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

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


Название: Re: Работа с буфером, типы данных.
Отправлено: Igors от Июнь 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);
}
 


Название: Re: Работа с буфером, типы данных.
Отправлено: Hoksmur от Июль 01, 2013, 11:56
 На неделю выпал, мои извинения.

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

 В чём вопрос: как читается начало буфера и уменьшается его размер? И как прочитать из того же буфера в тип short ?


Название: Re: Работа с буфером, типы данных.
Отправлено: Hoksmur от Июль 05, 2013, 05:01
 Нет ответов, закрываю. Если что - лучше новый топик заведу. ???