原文
我正在重建一些从C++
到D的代码:
import std.stdio;
import std.file;
import std.string;
import std.math;
struct WavHeader {
char[4] riff;
int flength;
char[4] wave;
char[4] fmt;
int chunk_size;
short format_tag;
short num_chans;
int sample_rate;
int bytes_per_second;
short bytes_per_sample;
short bits_per_sample;
char[4] data;
int dlength;
}
void main() {
WavHeader wahv;
wahv.riff[] = "RIFF".dup;
wahv.wave[] = "WAVE".dup;
wahv.fmt[] = "fmt ".dup;
wahv.data[] = "data".dup;
wahv.chunk_size = 16;
wahv.format_tag = 1;
wahv.num_chans = 1;
wahv.sample_rate = 8000;
wahv.bits_per_sample = 16;
wahv.bytes_per_sample = cast(short)((wahv.bits_per_sample / 8) * wahv.num_chans);
wahv.bytes_per_second = wahv.sample_rate * wahv.bytes_per_sample;
const int duration_seconds = 10;
const int buffer_size = wahv.sample_rate * duration_seconds;
wahv.dlength = buffer_size * wahv.bytes_per_sample;
wahv.flength = wahv.dlength + 44;
short[] buffer = new short[buffer_size];
foreach (i; 0 .. buffer_size) {
buffer[i] = cast(short)(cos((2.0 * PI * 256.0 * i) / wahv.sample_rate) * 1000);
}
//更正了文件处理
auto file = File("test.wav", "r");
file.rawWrite(wahv);
//按原始字节写音频数据
file.rawWrite(cast(ubyte[])buffer);
file.close();
}
因为我对这些话题
有些陌生,对Dlang
更是如此,所以我不太了解.问题在创建.wav
时,关于rawWrite
,我不确定该怎么办?
因为WaveHeader
中没有指针
,只有原始内存
,假设它都在cpu
小头中,且使用''align(1)''
,你可切片栈内存块
,并从中写入.
file.rawWrite((cast(ubyte*)&wahv)[0 .. WaveHeader.sizeof]);
但是,我建议按字段
写.
更多工作,但允许你处理字节序
问题并消除对齐
问题.如果需要,还可更改字段大小
.
原则与上述代码相同.
错误消息说的是,你试传递WavHeader
给rawWrite
,但rawWrite
需要一个切片(T[]
,T为类型
)参数.
解决的最简单方法是使用指针切片来创建wavh
的临时切片
:
file.rawWrite((&wahv)[0 .. 1]);