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]);

相关推荐

  1. 2312d,原始

    2023-12-28 11:56:06       58 阅读
  2. 2312d,D语言单元测试等

    2023-12-28 11:56:06       72 阅读
  3. 2312d,d调用中文C++库

    2023-12-28 11:56:06       66 阅读
  4. 2312d,d的sql构建器

    2023-12-28 11:56:06       59 阅读
  5. 2312llvm,读位码

    2023-12-28 11:56:06       62 阅读
  6. 2312d,d语言来绑定C++和rust

    2023-12-28 11:56:06       59 阅读
  7. 2312d,d语言调用C++的类

    2023-12-28 11:56:06       64 阅读
  8. 2312d,d语言作为胶水,用C++调用rust

    2023-12-28 11:56:06       65 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-28 11:56:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-28 11:56:06       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-28 11:56:06       82 阅读
  4. Python语言-面向对象

    2023-12-28 11:56:06       91 阅读

热门阅读

  1. 59.0/滤镜的使用(详细版)

    2023-12-28 11:56:06       42 阅读
  2. LeetCode389. Find the Difference

    2023-12-28 11:56:06       57 阅读
  3. 模型部署之——ONNX模型转RKNN

    2023-12-28 11:56:06       52 阅读
  4. sql 随机排序优化

    2023-12-28 11:56:06       49 阅读
  5. flutter websocket发送ping包?

    2023-12-28 11:56:06       61 阅读
  6. 知识付费小程序如何搭建?

    2023-12-28 11:56:06       57 阅读
  7. Python语法知识的笔记

    2023-12-28 11:56:06       46 阅读
  8. django的gunicorn的异步任务执行

    2023-12-28 11:56:06       63 阅读