0

Wave ファイルをロードする関数を作成しています。その過程で、ステレオの場合はデータを 2 つの個別のバッファに分割します。プログラムは i = 18 になり、左チャネルの fread パス中にクラッシュします。(cout は無視してかまいません。これらはデバッグ用に存在するだけです。)ファイルを 1 回のパスでロードし、memmove を使用してバッファを埋める必要があるのではないでしょうか?

if(params.channels == 2){
    params.leftChannelData = new unsigned char[params.dataSize/2];
    params.rightChannelData = new unsigned char[params.dataSize/2];

    bool isLeft = true;

    int offset = 0;
    const int stride = sizeof(BYTE) * (params.bitsPerSample/8);

    for(int i = 0; i < params.dataSize; i += stride)
    {
        std::cout << "i = " << i << " ";
        if(isLeft){
            std::cout << "Before Left Channel, ";
            fread(params.leftChannelData+offset, sizeof(BYTE), stride, file + i);
            std::cout << "After Left Channel, ";
        }
        else{
            std::cout << "Before Right Channel, ";
            fread(params.rightChannelData+offset, sizeof(BYTE), stride, file + i);
            std::cout << "After Right Channel, ";
            offset += stride;
            std::cout << "After offset incr.\n";
        }

        isLeft != isLeft;
    }

} else {
    params.leftChannelData = new unsigned char[params.dataSize];
    fread(params.leftChannelData, sizeof(BYTE), params.dataSize, file);
}
4

2 に答える 2

3

これは私には間違っているように見えます:file + i

ファイル ハンドルは 1 つだけですよね?それに追加しないiでください!!

file は FILE* です。ほとんどのポインターと同様に、ポインターに整数を追加すると、ファイル内のオフセットから読み取られるという前提がありました。

FILE* は、開いているファイルに関する情報を格納する FILE 構造体へのポインターです。そのポインターは常に stdio 関数に渡します。ファイル内の特定の位置にシークする場合は、 を使用しますfseek。ファイルを最初から最後まで順番に読み取るだけの場合は、シークする必要はありません。

于 2012-09-13T03:35:28.067 に答える
0

私の完全な解決策が欲しい人のために、私はこれを投稿しています。fread 呼び出し間の循環は、memcpy 呼び出し間の循環による 1 回の fread 呼び出しよりもはるかに遅いことが判明しました (ただし、2 倍のメモリが必要です)。投稿したコードのもう 1 つの問題は、次のように述べたことです。

isLeft != isLeft;

それ以外の

isLeft = !isLeft;

解決:

if(params.channels == 2){
    params.leftChannelData = new unsigned char[params.dataSize/2];
    params.rightChannelData = new unsigned char[params.dataSize/2];
    unsigned char * buf = new unsigned char[params.dataSize];

    fread(buf, sizeof(BYTE), params.dataSize, file);

    bool isLeft = true;

    int offset = 0;
    const int stride = params.bitsPerSample/8;

    for(int i = 0; i < params.dataSize; i += stride)
    {

        if(isLeft)
            memcpy(&params.leftChannelData[offset], &buf[i], stride * sizeof(BYTE));
        else{
            memcpy(&params.rightChannelData[offset], &buf[i], stride * sizeof(BYTE));
            offset += stride;
        }
        isLeft = !isLeft;
    }

    params.dataSize = params.dataSize/2;

    delete(buf);

} else {
    params.leftChannelData = new unsigned char[params.dataSize];
    params.rightChannelData = NULL;
    fread(params.leftChannelData, sizeof(BYTE), params.dataSize, file);
}
于 2012-09-13T05:36:36.377 に答える