waveOutWrite compatible with ASIO?
waveOutWrite compatible with ASIO?
我正在编写一个应用程序,我使用低延迟ASIO卡获取声音数据。低延迟意味着我每批只得到 128 个样本,采样率为 48k。从 ASIO 卡中,我获得了 32 位有符号整数范围内的原始样本。
现在我想听通过ASIO卡的声音,但不是在ASIO卡上,而是在Windows中的默认输出设备上。我正在使用具有WAVE_FORMAT_PCM和与ASIO输入相同的特征的waveOutWrite设置。每次我得到一个新的 128 个样本的长批次时,我都会打电话给它。现在,由于 Wav 格式不允许 32 位整数样本,因此我将它们降级为 16 位。
HWAVEOUT waveOut;
void startListening(){
WAVEFORMATEX format;
format.wFormatTag = WAVE_FORMAT_PCM;
format.nChannels = 1;
format.nSamplesPerSec = sampleRate;
format.nAvgBytesPerSec = sampleRate * 2;
format.nBlockAlign = 2;
format.wBitsPerSample = 16;
format.cbSize = 0;
MMRESULT result = waveOutOpen(waveOut, WAVE_MAPPER, &format, 0, 0, CALLBACK_NULL);
if(result != MMSYSERR_NOERROR){
return;
}
}
typedef struct{
short *buffer;
int length;
HWAVEOUT waveOut;
} ListenInfo;
void newListeningData(void *buffer, int length){
ListenInfo *listenInfo = new ListenInfo();
listenInfo->buffer = new short[length];
listenInfo->length = length;
listenInfo->waveOut = *waveOut;
if(bitrate == 32){
int *bufferInt = (int *)buffer;
for(int i = 0; i < length; i++){
listenInfo->buffer[i] = (bufferInt[i]);
}
CreateThread(NULL, 0, &(listen), listenInfo, 0, NULL);
}
else if(bitrate == 16){
memcpy(listenInfo->buffer, (short *)buffer, length * 2);
CreateThread(NULL, 0, &(listen), listenInfo, 0, NULL);
}
else{
printf("%d: Bitrate is not 16 or 32!n", index);
}
}
DWORD WINAPI listen(__in LPVOID lpParameter){
ListenInfo *info = (ListenInfo *)lpParameter;
WAVEHDR header;
memset(&header, 0, sizeof(WAVEHDR));
header.dwBufferLength = info->length;
header.lpData = (char *)(info->buffer);
MMRESULT result = waveOutPrepareHeader(info->waveOut, &header, sizeof(WAVEHDR));
result = waveOutWrite(info->waveOut, &header, sizeof(WAVEHDR));
while(waveOutUnprepareHeader(info->waveOut, &header, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING){
Sleep(10);
}
delete[] info->buffer;
delete info;
return 0;
}
问题是我只能听到严重的削波和吱吱声。声音失真得面目全非。我知道这不是同步错误,因为我还将样本保存到具有相同特性的 wav 文件中,并且声音以相同的方式失真。
如何将已签名的 32 位样本转换为 waveOutWrite 可以播放的内容?
问题是由于我使用的比特率与我被引导相信的比特率不同。当我用正确的值修改 WAVEFORMATEX 时,它起作用了!
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 提升 ASIO 无法识别计时器对象
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Using ECDHE TLS with Boost ASIO
- boost::asio io_service thread pool with io_service::work
- Using boost::asio::async_wait_until with boost::asio::stream
- boost:asio::read or boost:asio::async_read with timeout
- shared_from_this throws bad_weak_ptr with boost::asio
- boost::asio::async_write with std::string
- asio::io_context::run_one() with while()
- QTimer with asio::io_service.poll_one() or poll()
- boost::bind with member functions(作为boost::asio异步写入处理程序)
- Boost 1.49/1.50/1.51 ASIO with MinGW & GCC 4.7.0 中的转换错误
- Boost asio error with Cygwin
- streambuf with boost::asio::async_write
- Working with boost::asio::streambuf
- waveOutWrite compatible with ASIO?
- boost::asio::streambuf with wchar_t
- using boost::asio::local with MinGW
- Boost asio TCP IP asio class compile error with Visual Studio.错误:C2228:'.close'左侧必须具有类/结构/联合