PlaySound 功能奇怪的行为

Posted

技术标签:

【中文标题】PlaySound 功能奇怪的行为【英文标题】:PlaySound functions strange behavior 【发布时间】:2013-07-31 20:27:55 【问题描述】:

我正在用 C 语言编写一个函数来播放 wav 文件。我可以播放一次声音,但我想添加一个循环选项。

我有两种工作模式:

从文件名播放 凭记忆播放。

在这两种模式下,我无法播放声音超过两次,之后功能崩溃。

注意:我解决了将其添加到代码中的问题:

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

【问题讨论】:

单步执行循环时调试器会显示什么? 【参考方案1】:

在我的电脑中,代码可以正常工作。即使我多次播放该文件。 输出是:

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

【讨论】:

谢谢。我正在使用微型 c,我添加了这个头文件,现在我编译并运行正常,没有它它在运行时执行中失败。 BOOL WINAPI PlaySound(LPCSTR,HMODULE,DWORD); 很好奇我的代码是在 gcc 上编译的,可能是编译器,但我不知道。 也许之前调用约定错误? WINAPI 位有所不同。

以上是关于PlaySound 功能奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

具有辅助功能按钮形状的 UIBarButtonItem 的奇怪行为

UIPopoverController 奇怪的行为

Powershell解压缩功能 - 奇怪的行为

奇怪的列表打印功能行为。如果我打印“\n”就可以工作,如果我删除它就不行

冷融论的奇怪行为在外部功能中幸存?

Coffeescript奇怪的行为[重复]