С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование звука
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 1
Регистрация: 25.08.2014
Сообщений: 91

float в PCM 24 bit

12.12.2019, 18:44. Показов 3485. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ, поскажите плиз вот что:

Пишу под Windows, wasapi.
До этого использовал AUDCLNT_SHAREMODE_SHARED и горя не знал)
Но встала необходимость работать с bypass и пришлось использовать AUDCLNT_SHAREMODE_EXCLUSIVE.
Устройство принимает следующий формат:

C++
1
2
3
4
5
6
7
8
9
10
m_pwfx->Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
m_pwfx->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
m_pwfx->Format.nSamplesPerSec = 48000;
m_pwfx->Format.nChannels = 2;
m_pwfx->Format.wBitsPerSample = 24;
m_pwfx->Format.nBlockAlign = m_pwfx->Format.nChannels * (m_pwfx->Format.wBitsPerSample / 8);
m_pwfx->Format.nAvgBytesPerSec = m_pwfx->Format.nBlockAlign * m_pwfx->Format.nSamplesPerSec;
m_pwfx->Samples.wValidBitsPerSample = 24;
 m_pwfx->dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; // Just support stereo at this stage
m_pwfx->SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
У меня есть вектор float сэмплов для воспроизведения. Я этот вектор конвертировал в массив байт и скармливал аудио устройуству. Всё работает.
Теперь мне необходимо создать массив байт, но каждый float сэмпл конвертировать в 3 байта. Как это грамотно сделать?

Скорее всего просто умножить каждый float (он от -1 до 1) на максимальное значное 3 байтовое целое скорее всего бред?

Добавлено через 18 минут
Нашёл

int convert(double val) {
return lround(val * 0x7FFFFF) & 0xFFFFFF;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2019, 18:44
Ответы с готовыми решениями:

Воспроизведение аудиофайла PCM 8-bit 4 chan программно
Всех с Новым Годом! Есть такая штука, есть у меня некие данные. Я добавляю к массиву байт из файла с этими данными заголовок WAV-файла:...

Float to 24-bit float
Всем доброго времени суток. Разбираюсь с одним устройством, возникла необходимость слать ему 24-битовые float значения. Как указано...

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
#include<stdio.h> #include<stdlib.h> #include<math.h> float f1(float x)/*vira*enie 1*/ {return (x*cos(x))/(1+ pow(x,2));} ...

1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,300
Записей в блоге: 12
12.12.2019, 20:46
Цитата Сообщение от Igor7117 Посмотреть сообщение
Скорее всего просто умножить каждый float (он от -1 до 1) на максимальное значное 3 байтовое целое скорее всего бред?
Почему бред? На максимальное знаковое 24-битное целое.

Цитата Сообщение от Igor7117 Посмотреть сообщение
Нашёл
Да, похоже на правду. Только ещё есть смысл ограничить значение сверху, т.к. значения иногда могут превышать 1 по модулю (поэтому надо делать клиппинг):
C
1
2
3
int float_to_24bit_(float val) {
  return lround(fminf(fmaxf(val, -1.0f), 1.0f) * 0x7FFFFF) & 0xFFFFFF;
}
C++
1
2
3
4
int float_to_24bit(float val) {
  using namespace std;
  return lround(clamp(val, -1.0f, 1.0f) * 0x7FFFFF) & 0xFFFFFF;
}
Добавлено через 2 минуты
clamp в C++17 только работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2019, 20:46
Помогаю со студенческими работами здесь

Не понимает Dictionary<string, (float[][] train, float[][] valid, float[][] test)> DataSet;
Доброго времени суток. Пытаюсь запустить пример по работе с библиотекой. Не понимает конструкцию Dictionary&lt;string, (float train,...

Обясните мне, если Windows 32 bit, процессор 64 bit, то работает ли 2-ое ядро?
Обясните мне, если ОС Windows 32 bit, процессор 64 bit, все программы установлены разумеется 32 бит, то я так понимаю работает только одно...

Разбиение на треугольники: разное поведение WinXP 32 bit и Win 7 64 bit
Добрый день. Народ, я даже знаю в какую тему постить.... Вобщем словил глюк следующего содержания. Решается задача, схема которой...

HP ProBook 6570b (под 64-bit) встанет ли на него Win 32-bit?
Здравствуйте! Необходим ноутбук, чтобы в нем был аппаратный COM-порт - специализированый софт требует, выбрали HP ProBook 6570b. Однако,...

Ноут Aspire 5560G: не ставится Windows 7 64-bit, в отличие от 32-bit
На сайту Acer драйвера на 64-битную версию. Три диска втыкал &quot;Windows 7 SP1 64-bit&quot; сейчас. Два из них только что записал на болванки. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru