Seite 2 von 3

Verfasst: 22.02.2005 15:21
von Kaeru Gaman
@pickelrobert

> Synchron im klassischen Sinne bedeutet, das das Programm so lange wartet, bis der Sound abgespielt ist.

sorry, da verwechselst du's wirklich.
das bedeutet "Sequenziell im klassischen sinne"

wenn du unterschiedliche sounds nach festen zeitabständen sychronisierst,
dann kommt es zu überlagerungen bzw. pausen.

'syn' - vorsilbe 'gleich', 'chronos' - 'zeit' (griech.)
'sequi' - folgen (lat.)

Verfasst: 22.02.2005 15:52
von pickelrobert
Ich bezog mich mit "im Klassischen Sinne" mehr auf die API Definition der Befehle wie "SndPlaySound". Hier die entsprechende MSDN Passage:

[quote]
sndPlaySound

The sndPlaySound function plays a waveform sound specified either by a filename or by an entry in the registry or the WIN.INI file. This function offers a subset of the functionality of the PlaySound function; sndPlaySound is being maintained for backward compatibility.

BOOL sndPlaySound(
LPCSTR lpszSound,
UINT fuSound
);

Parameters

lpszSound

A string that specifies the sound to play. This parameter can be either an entry in the registry or in WIN.INI that identifies a system sound, or it can be the name of a waveform-audio file. (If the function does not find the entry, the parameter is treated as a filename.) If this parameter is NULL, any currently playing sound is stopped.
fuSound

Flags for playing the sound. The following values are defined:

SND_ASYNC

The sound is played asynchronously and the function returns immediately after beginning the sound. To terminate an asynchronously played sound, call sndPlaySound with lpszSoundName set to NULL.

SND_LOOP

The sound plays repeatedly until sndPlaySound is called again with the lpszSoundName parameter set to NULL. You must also specify the
SND_ASYNC flag to loop sounds.

SND_MEMORY

The parameter specified by lpszSoundName points to an image of a waveform sound in memory.

SND_NODEFAULT

If the sound cannot be found, the function returns silently without playing the default sound.

SND_NOSTOP

If a sound is currently playing, the function immediately returns FALSE, without playing the requested sound.

SND_SYNC

The sound is played synchronously and the function does not return until the sound ends.

Return Values

Returns TRUE if successful or FALSE otherwise.
[/quote]

Leider funktioniert das nur unter Windows.

Gruß

Verfasst: 22.02.2005 16:01
von ts-soft
hättest ja auch schon früher sagen können das die Funktion unter Linux verfügbar sein muß! Unter Linux gibt's mit Sicherheit eine ähnliche API-Funktion, wahrscheinlich im SDL-API. Da weiß ich aber nicht bescheid.

Verfasst: 22.02.2005 19:12
von Froggerprogger
Kann sein, dass der Begriff synchron auch in anderem Kontext gebraucht werden kann. Es gibt ja auch synchrone und asynchrone Datenübertragung, bzw. synchrone/asynchrone Verschlüsselung.
Dabei ist der letzte gemeinsame Nenner wohl nur noch, dass synchron das Vorhandensein irgendeines Zusammenhangs zwischen verschiedenen synchronosierten Teilen beschreibt.

Ich dachte nur an die Audio-typische Definition von synchron: synchrones Abspielen zu etwas. Z.B. zu einem Bild, oder zwei Sounds zeitlich genau synchron zueinander, etc.

Ist ja aber auch larifari-egal, denn löst das Problem ja nicht :wink:

a) Warten, bis PB ein IsPlaying() liefert, oder ein 'synchron'-Flag im Sinne, dass das Programm angehalten wird, bis der Song fertig ist. (Letzteres macht in meinen Augen allerdings nur in den allerwenigsten Fällen Sinn)
b) Andere Audioengine nutzen.
c) IsPlaying() für Windows und Linux selbermachen.

Verfasst: 23.02.2005 14:29
von pickelrobert
Beispiel für das synchrone Abspielen:

Sound1.1: GutenMorgen.wav
Sound1.2: GutenTag.wav
Sound1.3: GutenAbend.wav

Sound2.1: Herr.wav
Sound2.2: Frau.wav

Sound3.1: Müller.wav
Sound3.2: Meier.wav
Sound3.3: Schulze.wav

PlaySound (1.1)
PlaySound (2.1)
PlaySound (3.2)

Du verstehen Problema ?

Verfasst: 23.02.2005 15:54
von Kaeru Gaman
idee: wenn soundblaster-standards für dich ok wären,
müsste ja eigentlich für fast alle karten heutzutage,

schau doch mal im netz (SB-site & google) ob du was direkt
über port, interface, etc. erfahren kannst...

zu win95 zeiten gabs ne komplette interface-beschreibung für damalige soundblaster
im Buch 'PCintern 5' (Data Becker), dieses würde im moment nicht helfen,
da damals noch vieles über dos-interrupts lief...

aber die kommunikation mit dem port müsste ja für win und linux gleich sein...
vielleicht hilft es dir weiter, die karte direkt zu fragen...

Verfasst: 23.02.2005 18:39
von Froggerprogger
Mit fmod - und wahrscheinlich auch audiere und bass - ist das kein Problem, bzw. dürfte kein Problem sein.

Code: Alles auswählen

fmod - Pseudocode:
Fsound_Play (1.2)
While Fsound_IsPlaying(1.2)
Wend
PlaySound (2.1)
While Fsound_IsPlaying(2.1)
Wend
...
Alternative über EndCallback, d.h. Du kannst eine Funktion angeben, die als seperater Thread aufgerufen wird, sobald der Sound fertig ist, so könnte man schön parallel zum eigentlichen Programm eine Liste von Sounds abspielen.

Code: Alles auswählen

fmod-Pseudocode:
NewList MeineSounds()
AddListItem(Sound1.3)
AddListItem(Sound2.2)
AddListItem(Sound3.1)

Procedure EndCallback()
  *sound = NimmNaechstesElementVonListe(MeineSounds())
  PlaySound(*sound)
  SetEndCallback(*sound, @EndCallback())
EndProcedure

EndCallback()

Verfasst: 25.02.2005 18:45
von pickelrobert
Ich würde es gerne mit der SndPlaySound Variante versuchen - auch wenn sie nur unter Windows funktioniert. Allerdings weiß ich nicht wie ich

1. Ressource lade und
2. die geladene Ressource in Unicode umwandle

In VB sieht das so aus:

Code: Alles auswählen

     Dim buff as String, Res as Long
     buff = StrConv(LoadResData(103, "CUSTOM"), vbUnicode)
     Res = sndPlaySound(buff, SND_SYNC Or SND_MEMORY)

Danke schon mal für Eure Hilfe

Verfasst: 25.02.2005 19:23
von ts-soft
Wenn Du den Sound als Resource mit jaPBe einbindest, kannste Du ihn folgendermassen aufrufen:

Code: Alles auswählen

PlaySound_("Sound", GetModuleHandle_(0), #SND_RESOURCE | #SND_SYNC|#SND_NODEFAULT)
MessageRequester("Test", "Sound beendet") 
; jaPBe Version=2.5.2.24
; ResourceType3=19
; ResourceName=sound
; ResourceLanguage=0
; ResourceFile=bescheue.wav
; Build=0
; Language=0x0000 Language Neutral
; FirstLine=0
; CursorPosition=1
; ExecutableFormat=Windows
; DontSaveDeclare
; EOF
Der Sound ist als Wave mit dem Namen Sound eingebunden. Gruß Thomas

Verfasst: 25.02.2005 19:40
von pickelrobert
Danke. Das scheint soweit zu funktionieren. Aber woher weiß der Compiler, welches das richtige Format für WAV ist ? Meines Wissens (ich kann mich irren) gibt es keinen speziellen Ressourcentyp für WAV. Die werden doch als benutzerdefiniert abgelegt. Und warum brauche ich ein "Fremdtool" um Ressourcen einzubinden ? Gibts nicht sowas wie "IncludeRessource Res\DiesUndDas.Res" ?