2312d,原始写

原文
我正在重建一些从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]);

但是,我建议按字段写.
更多工作,但允许你处理字节序问题并消除对齐问题.如果需要,还可更改字段大小.
原则与上述代码相同.

错误消息说的是,你试传递WavHeaderrawWrite,但rawWrite需要一个切片(T[],T为类型)参数.
解决的最简单方法是使用指针切片来创建wavh临时切片:

  file.rawWrite((&wahv)[0 .. 1]);

猜你喜欢

转载自blog.csdn.net/fqbqrr/article/details/135261721