Home > other >  C ByteBeat dynamically allocated array not working
C ByteBeat dynamically allocated array not working

Time:01-16

I tried to play ByteBeat in C with a dynamically allocated array, I've been searching for 3 or more days to find an answer but no luck... I tried: malloc, HeapAlloc & HeapFree, new datatype & delete.

Here is my code:

    std::cout << "Enter duration:" << std::endl;
    int duration;
    std::cin >> duration;

    HWAVEOUT hwo = 0;
    WAVEFORMATEX wfx = { WAVE_FORMAT_PCM, 1, 8000, 8000, 1, 8, 0 };
    
    waveOutOpen(&hwo, WAVE_MAPPER, &wfx, 0, 0, CALLBACK_NULL);

    char* buffer = (char*)malloc(8000 * duration * sizeof(char));
    
    for (int t = 0; t < sizeof(buffer); t  ) {
        buffer[t] = t * (t >> 7);
    }

    WAVEHDR whdr = { (LPSTR)buffer, sizeof(buffer), 0, 0, 0, 0, 0, 0 };

    waveOutPrepareHeader(hwo, &whdr, sizeof(WAVEHDR));
    waveOutWrite(hwo, &whdr, sizeof(WAVEHDR));
    waveOutUnprepareHeader(hwo, &whdr, sizeof(WAVEHDR));
    waveOutClose(hwo);

    Sleep(1000 * duration);
    free(buffer);

When I try to make it: char buffer[8000 * 3], it works. Yes, I also did #pragma comment(lib, "winmm.lib") Please do not tell me to use constant!

CodePudding user response:

This is a classic. The problem is here:

With char buffer[100], sizeof(buffer) is 100. With char *buffer = ...., sizeof(buffer) is the size of a pointer on your platform (4 or 8).

So just use WAVEHDR whdr = { (LPSTR)buffer, 8000 * duration, 0, 0, 0, 0, 0, 0 } instead of WAVEHDR whdr = { (LPSTR)buffer, sizeof(buffer), 0, 0, 0, 0, 0, 0 }.

You should learn how to use your debugger, you could have found out this yourself in a matter of minutes.

  •  Tags:  
  • Related