I can't play system sounds using windows API.
Here is my PB 11.5 Classic function:
Function boolean PlaySoundW (string SoundName, long hModule, uint Flags) Library "WINMM.DLL" Function uint waveOutGetNumDevs () Library "WINMM.DLL"
uint lui_NumDevs long ll_mode long ll_module CONSTANT Long SND_APPLICATION = 128 // look for application specific association CONSTANT Long SND_ALIAS = 65536 // name is a WIN.INI [sounds] entry CONSTANT Long SND_ALIAS_ID = 1114112 // name is a WIN.INI [sounds] entry identifier CONSTANT Long SND_ASYNC = 1 // play asynchronously CONSTANT Long SND_FILENAME = 131072 // name is a file name CONSTANT Long SND_LOOP = 8 // loop the sound until next sndPlaySound CONSTANT Long SND_MEMORY = 4 // lpszSoundName points to a memory file CONSTANT Long SND_NODEFAULT = 2 // silence not default, if sound not found CONSTANT Long SND_NOSTOP = 16 // don't stop any currently playing sound // NOT IMPLEMENTED: CONSTANT Long SND_NOWAIT = 8192 // don't wait if the driver is busy CONSTANT Long SND_PURGE = 64 // purge non-static events for task CONSTANT Long SND_RESOURCE = 262148 // name is a resource name or atom CONSTANT Long SND_SYNC = 0 // play synchronously (default) CONSTANT LONG SND_ALIAS_START = 0 CONSTANT LONG SND_ALIAS_SYSTEMHAND = 18515 CONSTANT LONG SND_ALIAS_SYSTEMEXCLAMATION = 8531 CONSTANT LONG SND_ALIAS_SYSTEMASTERISK = 10835 CONSTANT LONG SND_ALIAS_SYSTEMQUESTION = 16211 CONSTANT LONG SND_ALIAS_SYSTEMDEFAULT = 17491 CONSTANT LONG SND_ALIAS_SYSTEMEXIT = 17747 CONSTANT LONG SND_ALIAS_SYSTEMSTART = 21331 CONSTANT LONG SND_ALIAS_SYSTEMWELCOME = 22355 // Not used setnull(ll_module) // Detect mode if ab_system then ll_mode = SND_ALIAS_ID else ll_mode = SND_FILENAME end if ll_mode += SND_NODEFAULT if not ab_blocking then // Async ll_mode += SND_ASYNC end if // No crash/error handling needed TRY lui_NumDevs = WaveOutGetNumDevs() IF lui_NumDevs > 0 THEN if not PlaySoundW(as_sound, ll_module, ll_mode) then // Playsound Error // Throw ??? messagebox("Playsound error", "") end if ELSE // No audio // Throw ??? END IF CATCH (runtimeerror lre) // No errors END TRY
And here is how I call it:
nc_smart.of_playsound("d:\test.wav", false, true) nc_smart.of_playsound("18515", true, true) nc_smart.of_playsound("SND_ALIAS_SYSTEMHAND", true, true)
First call works ok and plays the file.
Second and third calls pop the messagebox error
I've tried it in c++ and it works well:
#include "Windows.h" #include "Mmsystem.h" #include <iostream> #include "stdio.h" using namespace std; int main() { //stdout << SND_ASYNC; //return 100; printf("Playing SND_ALIAS_SYSTEMHAND %d\n", SND_ALIAS_SYSTEMHAND); PlaySoundA((LPCTSTR)SND_ALIAS_SYSTEMHAND, NULL, SND_ALIAS_ID | SND_NODEFAULT); printf("Playing SND_ALIAS_SYSTEMEXCLAMATION %d\n", SND_ALIAS_SYSTEMEXCLAMATION); PlaySoundA((LPCTSTR)SND_ALIAS_SYSTEMEXCLAMATION, NULL, SND_ALIAS_ID | SND_NODEFAULT); return 0; }
What's wrong with my PB code?
PS: I've tried with the ansi version but same error occurs