2013-05-09 3 views
1

Входной файл: in.wav. Я должен читать фрагменты (преуспел) и читать образцы для нормализации аудиофайла ...Ошибка приложения, хотя я не могу понять причину

Проблема в том, что он сбой при попытке сгладить значения образцов .wav-файла. Он просто найдет минимальное значение и максимальное значение в массиве, но он сработает ... Скажите, пожалуйста, что не так.

Вот код:

#include <stdio.h> 
#include <stdlib.h> 
#include "main.h" 
#define hdr_SIZE 64 

typedef struct FMT 
{ 
    char  SubChunk1ID[4]; 
    int   SubChunk1Size; 
    short int AudioFormat; 
    short int NumChannels; 
    int   SampleRate; 
    int   ByteRate; 
    short int BlockAlign; 
    short int BitsPerSample; 

} fmt; 

typedef struct DATA 
{ 
    char  Subchunk2ID[4]; 
    int   Subchunk2Size; 
    int   Data[441000]; 
} data; 

typedef struct HEADER 
{ 
    char  ChunkID[4]; 
    int   ChunkSize; 
    char  Format[4]; 
    fmt   S1; 
    data  S2; 
} header; 



int main() 
{ 
    FILE *input = fopen("in.wav", "rb"); /// nameIn 

    if(input == NULL) 
    { 
     printf("Unable to open wave file (input)\n"); 
     exit(EXIT_FAILURE); 
    } 

    FILE *output = fopen("out.wav", "wb"); /// nameOut 
    header hdr; 


    fread(&hdr, sizeof(char), hdr_SIZE, input); 
    /* NOTE: Chunks has been copied successfully. */ 


    /*###############################*/         
    /*##### UPDATE (char *ptr;) #####*/ 
    /*###############################*/ 
    char *ptr; // 'int' was written here instead of 'char'. That's was a stupid mistake... 
    long n = hdr.S2.Subchunk2Size; 


    /// COPYING SAMPLES... 
    ptr = malloc(sizeof(hdr.S2.Subchunk2Size)); 
    while (n-- != 0) 
    { 
     fread(&ptr, 1, 1, input); // Continues reading after the least 'stop' place. 
    }        // I was being told here (on "stack") that it is so... 


    n = hdr.S2.Subchunk2Size; // Resetting 'n'. 
    int min = ptr[0], max = ptr[0], i; 

    /* THE PROBLEM IS HERE: */ 
    for (i = 0; i < n; i++) 
     { 
      if (ptr[i] < min)  // If the next elements is less than previous, swap them. 
       min = ptr[i]; 
      if (ptr[i] > max) // If the next elements is bigger than previous, swap them. 
       max = ptr[i]; 
    } 

    printf("> > >%d__%d\n", min, max); // Displaying of 'min' and 'max'. 

    fclose(input); 
    fclose(output); 

    return 0; 
} 

UPDATE:

ЭВРИКА! Это все из-за 8 бит на образец! Я должен манипулировать ими (с образцами), как с типом символа. (См моего "### UPDATE ###" - комментарий в коде)

+0

Заполнение байтов ... Просеивание байтов везде! – 2013-05-09 18:43:55

+0

Вы пробовали использовать код через отладчик? (Также вы можете начать с 'i = 1', так как вы уже установили' min' и 'max' в' ptr [0] ') – Kninnug

+0

Что касается вашего обновления,' min' устанавливается в первый элемент динамически выделенный массив, для которого инициализируется 'ptr'. – jxh

ответ

1

Этого код:

/// COPYING SAMPLES... 
    ptr = malloc(sizeof(hdr.S2.Subchunk2Size)); 
    while (n-- != 0) 
    { 
     fread(&ptr, 1, 1, input); // Continues reading after the least 'stop' place. 
    }        // I was being told here (on "stack") that it is so... 

Заменяет первые байты из ptr переменных n раз. Это искажает значение ptr. Даже если вы исправили его для чтения в выделенный буфер вместо этого (удалив &), вы должны только переписать первый байт выделенной памяти.

То, что вы, вероятно, был предназначен:

fread(ptr, 1, n, input); 

Обратите внимание на цикл while не требуется. Но это было бы догадкой с моей стороны относительно ваших истинных намерений.

1

Вы развращают свой malloc() ред ptr с:

fread(&ptr, 1, 1, input); /* overwrite the content of ptr */ 

и поэтому аварийное завершение программы, если он пытается использовать ptr. Использование:

fread(ptr, 1, 1, input); 

Или лучше: не в то время как петли и использование:

fread(ptr, 1, n, inout); 
1

Как отмечалось другими, PTR не увеличивается в этом блоке,

while (n-- != 0) 
{ 
    fread(&ptr, 1, 1, input); // FIXME, ptr not incremented 
} 

Но вы пытаются хранить 1 байтовые данные как целочисленные; это то, что вы намереваетесь?

Смежные вопросы