2013-07-31 3 views
0

Я пишу функцию в C для воспроизведения wav файлов. Я могу воспроизвести один раз звук, но я хочу добавить опцию цикла.PlaySound функции странное поведение

У меня есть два режима работы:

  • игру от имени файла
  • воспроизведения из памяти.

В обоих режимах, я не могу играть звук более чем в два раза, после этого сбоя функции.

Примечание: Я решил, добавив это к коду:

BOOL WINAPI PlaySound (LPCSTR, HMODULE, DWORD);

без этого я получаю проблемы.

Мой код:

#include <windows.h> 
#include <stdio.h> 

void play(char * fileName, int repeat); 
char* file2vector(char* fileName, long int* size); 

int main(int argc, char ** argv) 
{ 
    if (argc > 1) { 
     play(argv[1], 5); 
    } 

} 


void play(char * fileName, int repeat) 
{ 
#define SND_SYNC 0 
#define SND_ASYNC 1 
#define SND_FILENAME 0x20000 
#define SND_NODEFAULT 2 
#define SND_MEMORY 4 
#define SND_NOSTOP 16 

    int mode = SND_SYNC | SND_NODEFAULT | SND_NOSTOP; 
    char * sound; 
    int play = 1; 
    int i; 

    long int size; 
    unsigned char* wavFile = file2vector(fileName, &size); 

    if (wavFile == NULL) { 
     mode |= SND_FILENAME; 
     sound = fileName; 
     printf("filename\n"); 
    } 
    else { 
     mode |= SND_MEMORY; 
     sound = wavFile; 
     printf("memory\n"); 

    } 


    if (repeat) { 
     play += repeat; 
    } 

    printf("play %d times\n", play); 

    int res; 
    for (i = 1; i <= play; ++i) { 
     printf("played %i\n", i); 
     res = PlaySound(sound, NULL, mode); 
     printf("res:%d\n", res); 
    } 

    PlaySound(NULL, 0, 0); 
    free(wavFile); 

    printf("ready"); 


} 

char* file2vector(char* fileName, long int* size) 
{ 
    char* vector = NULL; 
    FILE* file = fopen(fileName, "rb"); 

    if (NULL == file) { 
     *size = 0L; 
    } 
    else 
    { 
     fseek(file, 0L, SEEK_END); 
     *size = ftell(file); 
     fseek(file, 0L, SEEK_SET); 

     /* ftell can return -1 on failure */ 
     if (*size <= 0) { 
      *size = 0L; 

     } 
     else 
     { 
      vector = (char*)malloc(*size); 
      if (NULL != vector) { 
       fread(vector, sizeof(char), *size, file); 
      } 
     } 

     fclose(file); 
    } 

    return vector;  
} 

, когда я запускаю этот код, например:

pplay.exe c:\windows\media\chimes.wav 

он печатает:

memory 
play 6 times 
played 1 
res:1 
played 2 
res:1 
played 4198705 
+0

Что показывает отладчик, когда вы проходите через свой цикл? –

ответ

0

В моем компьютере код работает правильно. Даже если я больше играю в файл. Выход:

C:\Users\avesudra\*****\***\*****\example\bin\Debug>example.exe c:\windows\media\chimes.wav 
memory 
play 8 times 
played 1 
res:1 
played 2 
res:1 
played 3 
res:1 
played 4 
res:1 
played 5 
res:1 
played 6 
res:1 
played 7 
res:1 
played 8 
res:1 
ready

Это довольно странно. Если вы хотите, вы можете скачать этот исполняемый файл здесь, чтобы попробовать и посмотреть, работает ли: https://www.dropbox.com/s/iphluu1huzq48vk/example.exe

+0

Спасибо. Я использую крошечный c, я добавляю этот заголовок, и теперь я компилирую и запускаю нормально, без него он не работает во время выполнения. BOOL WINAPI PlaySound (LPCSTR, HMODULE, DWORD); – carlos

+0

Любопытно, что мой код скомпилирован на gcc, может быть у компилятора, но я не знаю. – avesudra

+0

Возможно, это вызывалось ранее с неправильным соглашением? Бит WINAPI имеет значение. –

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