0

wavPlayファイル用に C で関数を作成しています。音を1回再生することはできますが、ループオプションを追加したいです。

私には 2 つの作業モードがあります。

  • ファイル名から再生
  • メモリから再生します。

どちらのモードでも、サウンドを 2 回以上再生できず、その後関数がクラッシュします。

注:これをコードに追加して解決しました:

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
4

1 に答える 1

0

私のコンピューターでは、コードは正しく機能します。ファイルを何度も再生しても。出力は次のとおりです。

C:\Users\avesudra\*****\***\*****\example\bin\Debug>example.exe c:\windows\media\chimes.wav
メモリー
8回プレイ
プレイした 1
解像度:1
プレイした 2
解像度:1
プレイした 3
解像度:1
プレイした 4
解像度:1
プレイした 5
解像度:1
プレイした 6
解像度:1
7回プレイ
解像度:1
プレイした 8
解像度:1
準備

それはかなり奇妙です。必要に応じて、ここから実行可能ファイルをダウンロードして試してみて、動作するかどうかを確認してください: https://www.dropbox.com/s/iphluu1huzq48vk/example.exe

于 2013-07-31T21:30:13.600 に答える