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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с кодировкой и параметрами QAudioDeviceInfo  (Прочитано 6365 раз)
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
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Август 15, 2012, 18:04 »

"default" - устройство, которое выбрано по умолчанию в системе для ввода или вывода.
Проблема с названиями имеется, кодировка вроде бы cp1252.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #2 : Август 16, 2012, 09:34 »

1. Про "default" тебе уже ответили.
2. Про кодировку тоже. Можно перекодировать.
3. Будет всегда обрезанным по 32 байта с учётом последнего "\0". По крайней мере в линейке Qt 4.8.x.

Я бы не рекомендовал пользоваться QAudioInput для более/менее серьёзных задач. Причины можешь поискать в этом же разделе форума. Рекомендую воспользоваться для ввода/вывода звука любой из бесплатных кроссплатформенных библиотек типа RtAudio, portaudio и т.д. Прекрасно интегрируются и легко используются совместно с Qt. Тоже обсуждалось здесь же.
Записан
kobra
Гость
« Ответ #3 : Август 16, 2012, 14:11 »

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

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

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Август 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.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #5 : Август 17, 2012, 14:28 »

QAudioInput мне нужно только чтоб получить отсчеті.
Ну вот те перечисленные библиотеки предназначены именно для этого и умеют это делать гораздо лучше, чем QAudioInput.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Сентябрь 14, 2012, 16:34 »

Я фиксил этот баг в прошлом году, но из-за переезда на геррит патч похерился. В результате его пофиксили только сейчас в 4.8.3 (кутеха теперь хранит имена девайсов в utf8, а не latin1 (гыгы))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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