Click here to Skip to main content
15,889,200 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
hi i want to record audio from mic. if bitwBitsPerSample set to 8, it works perfectly, but when it's set to 16, the record file contain horrible noise, how can i solve this problem? source code;

C++
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <aviriff.h>
 #include <mmsystem.h>

//WAV format def 
#define		WAV_CHN 1    //mono
#define		WAV_SMP    44100    //sample per sec
#define     WAV_BIT    16    //bit rate
#define     WAV_LENG_SEC    30    //record length(sec)

//wave buf len(channel*sample*bitrate/8*length)
#define WAVBUFFERLENGTH (WAV_CHN * WAV_SMP * (WAV_BIT / 8) * WAV_LENG_SEC)


WAVEFORMATEX g_WavFmt = {0};


//Wave header length
#define HEADERLENGTH (sizeof(RIFFLIST) + sizeof(RIFFCHUNK) + sizeof(WAVEFORMATEX) + sizeof(RIFFCHUNK))


void InitWavFmt(void)
{
    g_WavFmt.wFormatTag = WAVE_FORMAT_PCM;
    g_WavFmt.nChannels = WAV_CHN;
    g_WavFmt.nSamplesPerSec = WAV_SMP;
    g_WavFmt.wBitsPerSample = WAV_BIT;
    g_WavFmt.nBlockAlign = 2;
    g_WavFmt.nAvgBytesPerSec = g_WavFmt.nChannels * g_WavFmt.wBitsPerSample / 8 * g_WavFmt.nSamplesPerSec;
    g_WavFmt.cbSize = 0;
}


char* AddWavHdr(char *pinBuffer, int inWavLength)
{
    BYTE *pWavHdr = NULL;
    RIFFLIST  *pRiffWave = NULL;
    RIFFCHUNK *pRiffFmt = NULL;
    RIFFCHUNK *pRiffData = NULL;
    char* outWavBuffer = NULL;

    if (NULL == pinBuffer)
    {
        return NULL;
    }
    
    pWavHdr = (BYTE *)malloc(sizeof(BYTE) * HEADERLENGTH);
    if ( NULL == pWavHdr)
    {
        return NULL;
    }
    else
    {
        memset(pWavHdr, 0, sizeof(BYTE) * HEADERLENGTH);
    }

    pRiffWave = (RIFFLIST*)pWavHdr;
    pRiffFmt  = (RIFFCHUNK*)(pRiffWave + 1);
    pRiffData = (RIFFCHUNK*)(((BYTE*)(pRiffFmt + 1)) + sizeof(WAVEFORMATEX));

    pRiffWave->fcc = FCC('RIFF');
    pRiffWave->cb = inWavLength + HEADERLENGTH - sizeof(RIFFCHUNK);
    pRiffWave->fccListType = FCC('WAVE');

    pRiffFmt->fcc = FCC('fmt ');
    pRiffFmt->cb = sizeof(WAVEFORMATEX);

    pRiffData->fcc = FCC('data');
    pRiffData->cb = inWavLength;

    memcpy(pRiffFmt + 1, &g_WavFmt, pRiffFmt->cb);



    outWavBuffer = (char *)malloc(sizeof(BYTE) * (inWavLength + HEADERLENGTH));
    if (NULL == outWavBuffer)
    {
        return NULL;
    }
    else
    {
        memset(outWavBuffer, 0, sizeof(BYTE) * (inWavLength + HEADERLENGTH));
    }
    
    memcpy(outWavBuffer, pWavHdr, sizeof(BYTE) * HEADERLENGTH);
    memcpy(outWavBuffer + HEADERLENGTH, pinBuffer, (sizeof(BYTE) * inWavLength));
    return outWavBuffer;
}

void main ()
{
    HWAVEIN hWavIn;
    WAVEHDR WavHdr;
    char *pBuffer = NULL;
    char *pWavBuffer = NULL;    MMRESULT ret;
    FILE *fpPCMFile;
    FILE *fpWavFile;
    MMTIME MMTime = {0};   
    unsigned int numwritten = 0;
    MMTime.wType = TIME_BYTES;

    InitWavFmt();

    if (0 == waveInGetNumDevs())
    {
        printf("Audio device not found!\n");
        exit(0);
    }

   
    ret = waveInOpen(&hWavIn, WAVE_MAPPER, &g_WavFmt, 0L, 0L, WAVE_FORMAT_DIRECT);
    if (MMSYSERR_NOERROR != ret)
    {
        printf("Unsupported WAV format.\n");
        exit(0);
    }

 if (ret)
 {
  printf("Couldn't open th mic");
  return;
 }

    ret = waveInOpen(&hWavIn, WAVE_MAPPER, &g_WavFmt, 0, 0, CALLBACK_NULL);
    

    if (MMSYSERR_NOERROR != ret)
    {
        exit(0);
    }
    
    pBuffer = (char *)malloc(WAVBUFFERLENGTH);
    if ( NULL != pBuffer)
    {
        memset(pBuffer, 0, WAVBUFFERLENGTH);
    }
    else
    {
        exit(0);
    }

    WavHdr.lpData = pBuffer;
    WavHdr.dwBufferLength = WAVBUFFERLENGTH;
    WavHdr.dwBytesRecorded = 0;
    WavHdr.dwUser = 0;
    WavHdr.dwFlags = 0;
    WavHdr.dwLoops = 1;
    WavHdr.lpNext = 0;
    WavHdr.reserved = 0;

    ret = waveInPrepareHeader(hWavIn,&WavHdr,sizeof(WAVEHDR));
    if (MMSYSERR_NOERROR != ret)
    {
        free(pBuffer);
        exit(0);
    }

    ret = waveInAddBuffer(hWavIn, &WavHdr, sizeof(WAVEHDR));
    if (MMSYSERR_NOERROR != ret)
    {
        free(pBuffer);
        exit(0);
    }


    printf ("Press any key to start recording...\n");
    getch();
    printf ("Recording now\n");

    ret = waveInStart(hWavIn);
    if (MMSYSERR_NOERROR != ret)
    {
        free(pBuffer);
        exit(0);
    }

    printf ("Press any key to stop Recording\n");
    getch();
    waveInGetPosition(hWavIn, &MMTime, sizeof(MMTime));
    waveInReset(hWavIn);

    waveInUnprepareHeader(hWavIn,&WavHdr,sizeof(WAVEHDR));
    waveInClose(hWavIn);
    
    fpPCMFile = fopen("pcm","w");
    if (NULL == fpPCMFile)
    {
        printf("Creating PCM file failed\n");
        free(pBuffer);
        exit(0);
    }

    numwritten = fwrite(pBuffer, sizeof(char), MMTime.u.cb, fpPCMFile);

    printf ("Recording done, %d bytes recorded, %d bytes written\n", MMTime.u.cb, numwritten);

    fclose(fpPCMFile);

    pWavBuffer = AddWavHdr(pBuffer, MMTime.u.cb);
    if ( NULL == pWavBuffer)
    {
        printf("Add header failed\n");
    }
    else
    {
        fpWavFile = fopen("wave.wav", "w");
        if (NULL == fpWavFile)
        {
            printf("Creating WAV file failed\n");
        }
        else
        {
            numwritten = fwrite(pWavBuffer, sizeof(char), sizeof(BYTE) * (HEADERLENGTH + MMTime.u.cb), fpWavFile);
            printf("%d bytes of WAV file written\n", numwritten);
            fclose(fpWavFile);
            free(pWavBuffer);
        }
    }
//PlaySound(TEXT("wave.wav"), NULL, SND_FILENAME);
    free(pBuffer);
    getch();
    return;    
}
Posted
Updated 14-Oct-10 23:27pm
v2
Comments
Sauro Viti 15-Oct-10 5:28am    
Please, use the PRE tags to improve the readability

1 solution

Try reducing the WAV_SMP value



Which is the samples per second ..




:cool::cool::cool:
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900