簡體   English   中英

為什么我的數組在C中返回錯誤的值?

[英]Why is my array returning the wrong values in C?

我正在嘗試使用libsndfile庫在音頻文件之間讀取/寫入信息。

我設法讀取了原始文件,並使用“水印”值編寫了一個副本。

我現在想要做的就是打印任何值不為0的索引。

但是,當我調用我的printBuffer()函數時,即使在調試模式下,它也會返回全0,我可以看到緩沖區中的值不為零/每次迭代都更改。

我是否錯誤地調用了緩沖區數組?

我對C還是很陌生,因此,如果您有任何建議,將不勝感激。

謝謝。

碼:

#define _CRT_SECURE_NO_DEPRECATE    
#include <stdio.h>
#include <stdlib.h>
#include <sndfile.h>
#include <time.h>

#define MAX_CHANNEL 2
#define BUF_SIZE 1024

int numItems(int frames, int channels);
void printInfo(int frames, int channels, int sampleRate);
void watermark(double *buffer, int count, int channels);
void watermark2(double *buffer, int count);
void readFile(int fileNumber);
void printBuffer(double *buffer, size_t count);

int main(void)
{

    int chosenFile, answer;

    printf("Please select the file you want to read\n");
    printf("1. File1\n");
    printf("2. File2\n");
    printf("3. File3\n");
    printf("4. File4\n");
    printf("5. File5\n");
    scanf("%d", &chosenFile);   

    processFile(chosenFile);
    /*
    Put boolean here to check whether to process the original file or the new one
    */
    printf("Would you like to read the new file?\n");
    printf("1. Yes\n");
    printf("2. No\n");
    scanf("%d", &answer);

    if (answer == 1)
    {
        readFile(chosenFile);
    }

}

int processFile(int fileNumber)
{
    /*READING FILE*/

    static double buffer[BUF_SIZE];
    SF_INFO info;
    SNDFILE *infile,*outfile;
    int readCount, i;


    /*
    Put boolean here to check whether it should read the original files, or the new output files

    */
    char *Files[] = { "File1.wav", "File2.wav", "File3.wav"
        , "File4.wav", "DFile5.wav" };

    char *Files2[] = { "File1Output.wav", "File2Output.wav", "File3Output.wav"
        , "File4Output.wav", "File5Output.wav" };

    char *inputFile = Files[fileNumber - 1];

    if (!(infile = sf_open(inputFile, SFM_READ, &info)))
    {
        printf("Not able to open input file %s.\n", inputFile);
        puts(sf_strerror(NULL));
        return 1;
    };


    printf("You have opened: %s\n", Files[fileNumber - 1]);
    printInfo( info.frames, info.channels, info.samplerate);
    int num = numItems(info.frames, info.channels);
    printf("Buffer(frames*channels): %d \n", num);


    /*WRITING FILE*/    
    char *outputFile = Files2[fileNumber - 1];
    printf("Your file has been saved in the following location: %s\n", outputFile);


    if (!(outfile = sf_open(outputFile, SFM_WRITE, &info)))
    {
        printf("Not able to open output file %s.\n", outputFile);
        puts(sf_strerror(NULL));
        return 1;
    };

    /*
    Actual buffer size is numItems, somehow can't declare buffer as buffer[numItems]
    BUF_SIZE is set to 1024, which means that it reads the data in chunks of 1024 frames
    it will keep writing in 1024 chuncks until all numItems have been written (numItems/BUF_SIZE)
    Needs to be on a while loop otherwise it will only write the first 1024 frames of the file
    */


    while ((readCount = sf_read_double(infile, buffer, BUF_SIZE)))
    {   

        watermark(buffer, readCount, info.channels);
        sf_write_double(outfile, buffer, readCount);
    };


    for (i = 0; i < sizeof(buffer) / sizeof *buffer; i++)
    {
        printBuffer(buffer, sizeof(buffer)/sizeof *buffer);
    }


    /*
    Can only close SF_open once both reading/writing has been done
    if you close infile after the read, it's not able to copy the audio
    data from infile to write into outfile
    */
    sf_close(infile);
    sf_close(outfile);


    return;
}

void readFile(int fileNumber)
{
    SF_INFO info;
    SNDFILE *infile;

    char *Files[] = { "File1Output.wav", "File2Output.wav", "File3Output.wav"
        , "File4Output.wav", "File5Output.wav" };

    char *inputFile = Files[fileNumber - 1];

    infile = sf_open(inputFile, SFM_READ, &info);

    printf("You have opened: %s\n", Files[fileNumber - 1]);
    printInfo(info.frames, info.channels, info.samplerate);

    sf_close(infile);

    return;


}

int numItems(int frames, int channels)
{
    int numItems = frames * channels;
    return numItems;
}
void printInfo(int frames, int channels, int sampleRate)
{
    printf("Number of Frames = %d\n", frames);
    printf("Number of Channels = %d\n", channels);
    printf("Sample Rate = %d\n", sampleRate);
}

void watermark(double *buffer, int count, int channels)
{       
    double value[MAX_CHANNEL] = { 0.0, 0.0 };
    int i, j;

    if (channels > 1)
    {
        /*
        Sets j to be the first channel and while i is less than 1024/5, i += channels
        buffer[3] value is multiplied by 0, and set to 0
        this mutes that particular index value or frame
        this keeps going until i>=1024/5 and then the next channel is chosen where j = 2
        buffer[4] value is multiplied by 0 and set to 0
        this keeps going until i>=1024/5 where it calls back to the while loop in processFile
        */

        for (j = 0; j < channels; j++)
        {
            for (i = j; i < count / 5; i += channels)
            {
                buffer[i] *= value[j];
            }
        }
    }
    else
    {
        /*
        If audio file has 1 channel, buffer[i] is set to 0 for all values < 1024/5 frames
        and it goes back to normal until the next 1024 frames where the first  1024/5 frames.
        */
        for (i = 0; i < count / 5; i++)
        {
            buffer[i] *= value[0];
        }
    }

    return;
}

void printBuffer(double *buffer, size_t count)
{
    int i;

    for (i = 0; i < count; i++)
    {
        if (i != 0)
            printf("%d\n", buffer[i]);
    }
}

/*
- *DONE* - Need to create function that will read the newly outputted file 
- Find where the watermarks have been left on the audio
- Compare buffer[] values between original file and new outputted file
*/
while ((readCount = sf_read_double(infile, buffer, BUF_SIZE)))
{   

    watermark(buffer, readCount, info.channels);
    sf_write_double(outfile, buffer, readCount);
};

在這里,您一次又一次地使用緩沖區讀取一些數據,對其加水印並將其寫出。只有完成后,才從緩沖區中打印出最后剩余的數據:

for (i = 0; i < sizeof(buffer) / sizeof *buffer; i++)
{
    printBuffer(buffer, sizeof(buffer)/sizeof *buffer);
}

因此,

#define MAX_CHANNEL 2
#define BUF_SIZE 1024

以及具有16位44100立體聲的wave文件,如果您具有正常的音頻(例如音樂)或一些高質量的錄制語音而幾乎沒有噪聲,則您只會看到最后5.8ms的聲音數據,這幾乎是無聲的。

另外:根據最后讀取的塊,您會看到文件的尾部,然后看到尾部之前的某部分,就像您看到的最后3.2ms然后是其之前的2.6ms,這在上次讀取時並未覆蓋呼叫。

/ edit:好的,可能我輸入的數字錯誤,數據類型為double,依此類推,但是概念上的錯誤是相同的。

/ edit 2:查看喬納森·萊弗勒(Jonathan Leffler)的評論,我發現還有更多錯誤...-我建議打開所有編譯器警告,並嘗試理解(並修復)它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM