Russian Qt Forum

Qt => Мультимедиа => Тема начата: kobra от Август 15, 2012, 14:59



Название: Проблема с кодировкой и параметрами QAudioDeviceInfo
Отправлено: kobra от Август 15, 2012, 14:59
Доброго времени суток
Пишу небольшое приложения для обработки звука, но сразу столкнулся с проблемой.
Попробовал отобразить названия устройств:
Код:
QList<QAudioDeviceInfo> list = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
    for(int i = 0; i < list.size(); i++)
        qDebug() << list.at(i).deviceName();
printInfoAboutAudioDevice(list.at(0),"INPUT");
Получил следующий список:
Цитировать
"Iannea ano?. iee?ioiia (IDT Hig"
"Iee?ioii (IDT High Definition A"
"Noa?ai ieeoa? (IDT High Definit"
"default"
Первое что непонятно почему названия в такой кодировке, а второе почему обрезано. Ну и третье что такое default.
Зашел в настройки Skype список следующий:
Цитировать
Массив встр. микрофона (IDT High Definition Audio CODEC)
Микрофон (IDT High Definition Audio CODEC)
Стерео микшер (IDT High Definition Audio CODEC)

Ладно по сравнению списков, понятно что за что отвечает. Пробую отобразить информацию о Массив встр. микрофона.
Код:
void printInfoAboutAudioDevice(QAudioDeviceInfo device, QString name)
{
    QAudioDeviceInfo info(device);

    QList<QAudioFormat::Endian> listOfByteOrders = info.supportedByteOrders();
    qDebug() << "Supported byte orders(" << name << "):";
    for(int i = 0; i < listOfByteOrders.size(); i++)
        qDebug() << "  " << listOfByteOrders.at(i);

    QList<int> listOfChannelCounts = info.supportedChannelCounts();
    qDebug() << "Supported channel counts(" << name << "):";
    for(int i = 0; i < listOfChannelCounts.size(); i++)
        qDebug() << " " << listOfChannelCounts.at(i);

    QList<int> listOfChannels = info.supportedChannels();
    qDebug() << "Supported channels(" << name << "):";
    for(int i = 0; i < listOfChannels.size(); i++)
        qDebug() << " " << listOfChannels.at(i);

    QStringList listOfCodecs = info.supportedCodecs();
    qDebug() << "Supported codecs(" << name.toUtf8() << "):";
    for(int i = 0; i < listOfCodecs.size(); i++)
        qDebug() << " " << listOfCodecs.at(i);

    QList<int> listOfFrequencies = info.supportedFrequencies();
    qDebug() << "Supported frequencies(" << name << "):";
    for(int i = 0; i < listOfFrequencies.size(); i++)
        qDebug() << " " << listOfFrequencies.at(i);

    QList<int> listOfSampleRates = info.supportedSampleRates();
    qDebug() << "Supported sample rates(" << name << "):";
    for(int i = 0; i < listOfSampleRates.size(); i++)
        qDebug() << " " << listOfSampleRates.at(i);

    QList<int> listOfSampleSizes = info.supportedSampleSizes();
    qDebug() << "Supported sample sizes(" << name << "):";
    for(int i = 0; i < listOfSampleSizes.size(); i++)
        qDebug() << " " << listOfSampleSizes.at(i);

    QList<QAudioFormat::SampleType> listOfSampleTypes = info.supportedSampleTypes();
    qDebug() << "Supported sample types(" << name << "):";
    for(int i = 0; i < listOfSampleTypes.size(); i++)
        qDebug() << " " << listOfSampleTypes.at(i);
}
Получаю:
Цитировать
Supported byte orders( "INPUT" ):
Supported channel counts( "INPUT" ):
Supported channels( "INPUT" ):
Supported codecs( "INPUT" ):
Supported frequencies( "INPUT" ):
Supported sample rates( "INPUT" ):
Supported sample sizes( "INPUT" ):
Supported sample types( "INPUT" ):
Как видим пусто. То же для для других кроме Default, здесь все ок:
Цитировать
Supported byte orders( "INPUT" ):
   1
Supported channel counts( "INPUT" ):
  1
  2
Supported channels( "INPUT" ):
  1
  2
Supported codecs( "INPUT" ):
  "audio/pcm"
Supported frequencies( "INPUT" ):
  8000
  11025
  22050
  44100
  48000
  96000
Supported sample rates( "INPUT" ):
  8000
  11025
  22050
  44100
  48000
  96000
Supported sample sizes( "INPUT" ):
  8
  16
Supported sample types( "INPUT" ):
  1
  2
Но я не знаю что он из себя представляет, у меня кроме тех 3 девайсов больше ничего на компе нет(если точнее то кроме первого ничего нет на самом деле)
Такой же результат для AudioOutput


Название: Re: Проблема с кодировкой и параметрами QAudioDeviceInfo
Отправлено: LisandreL от Август 15, 2012, 18:04
"default" - устройство, которое выбрано по умолчанию в системе для ввода или вывода.
Проблема с названиями имеется, кодировка вроде бы cp1252.


Название: Re: Проблема с кодировкой и параметрами QAudioDeviceInfo
Отправлено: xokc от Август 16, 2012, 09:34
1. Про "default" тебе уже ответили.
2. Про кодировку тоже. Можно перекодировать.
3. Будет всегда обрезанным по 32 байта с учётом последнего "\0". По крайней мере в линейке Qt 4.8.x.

Я бы не рекомендовал пользоваться QAudioInput для более/менее серьёзных задач. Причины можешь поискать в этом же разделе форума. Рекомендую воспользоваться для ввода/вывода звука любой из бесплатных кроссплатформенных библиотек типа RtAudio, portaudio и т.д. Прекрасно интегрируются и легко используются совместно с Qt. Тоже обсуждалось здесь же.


Название: Re: Проблема с кодировкой и параметрами QAudioDeviceInfo
Отправлено: kobra от Август 16, 2012, 14:11
1. Понятно. Не понятно почему. У меня нет параметров для других девайсов.
2. Чесно не понятно как перекодировать. Пробовал написать:
Код:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"))
а также с параметром System не помогло.
3. Очень жаль, как то не очень умно обрезать названия.

QAudioInput мне нужно только чтоб получить отсчеті. Дальше они попадают под обработку БПФ и других алгоритмов.


Название: Re: Проблема с кодировкой и параметрами QAudioDeviceInfo
Отправлено: LisandreL от Август 16, 2012, 14:52
Чесно не понятно как перекодировать. Пробовал написать:
Код:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"))
а также с параметром System не помогло
Надо именно перекодировать (так как в самом Qt какая-то ошибка с кодировками):
Код
C++ (Qt)
QString crunch( QString s )
{
   static QTextDecoder d1251( QTextCodec::codecForName( "cp1251" ) );
   static QTextEncoder e1252( QTextCodec::codecForName( "cp1252" ) );
   return d1251.toUnicode( e1252.fromUnicode( s ) );
}
...
   QList<QAudioDeviceInfo> list = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
   for(int i = 0; i < list.size(); i++)
       qDebug() << crunch( list.at(i).deviceName() );
Цитировать
"Микрофон (Realtek High Definiti"
"default"
Но это именно ошибка Qt (его реализации под Windows).
На багтрекере предлагают использовать QtMultimediaKit из QtMobility.


Название: Re: Проблема с кодировкой и параметрами QAudioDeviceInfo
Отправлено: xokc от Август 17, 2012, 14:28
QAudioInput мне нужно только чтоб получить отсчеті.
Ну вот те перечисленные библиотеки предназначены именно для этого и умеют это делать гораздо лучше, чем QAudioInput.


Название: Re: Проблема с кодировкой и параметрами QAudioDeviceInfo
Отправлено: Авварон от Сентябрь 14, 2012, 16:34
Я фиксил этот баг в прошлом году, но из-за переезда на геррит патч похерился. В результате его пофиксили только сейчас в 4.8.3 (кутеха теперь хранит имена девайсов в utf8, а не latin1 (гыгы))