Toon posts:

IDirectSoundNotify werkt alleen met grote WAVbuffers :?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Programmeerbroeders. Ik heb weer eens een probleem, dit keer met DirectSound Notify-Events in Delphi. Ik heb een stukje code opgesteld dat een IDirectSoundBuffer afspeelt, en op bepaalde punten (bytenrs) in die buffer wordt het event Event aangeroepen. Het frappante is alleen, dat dit wel gebeurt bij brass.wav, een wavje van 7 seconden, en niet bij 19long.wav, een wavje van 3 seconden. Dan worden de events niet 'wakker' en blijft hij steeds in de WaitForSingleObject hangne. Ik dacht: wat is er verschillend aan die wavjes? Nou, brass.wav was langer. Ik maak 19long dus langer, 10 seconden, en voila het werkt.
Maar.. dit moet niet zo. He tmoet ook met kortere wavjes werken. Heeft iemand gezien wat ik fout doe ?

----------------------------------------------------------------------------
var
noti: IDirectSoundNotify; // pointer to the interface
waitresult: DWord;
i: Integer;
PosNots : array[0..1] of TDSBPOSITIONNOTIFY;
Event: Integer;
begin
//(47059, 130633) voor 19long.wav
//(90192, 176795) voor brass.wav
setupDirectSoundBuffer('19long.wav');
// setupDirectSoundBuffer('brass.wav');
Event := CreateEvent(nil, false, false, nil);

PosNots[0].dwOffset := 47059 * 4; // dwOffset is in bytes, 1smp = 4 bytes
PosNots[1].dwOffset := 130633 * 4;
PosNots[0].hEventNotify := Event;
PosNots[1].hEventNotify := Event;

DSErrorLog('Querying IDD_IDirectSoundNotify interface', // noti wordt aangemaakt
buffers[0].QueryInterface(IID_IDirectSoundNotify, noti));
noti.SetNotificationPositions(2, @PosNots);

buffers[0].Play(0,0,0); // mijn IDirectSoundBuffer

Log('Waiting for event 1');
waitresult := WaitForSingleObject(Event, INFINITE);
WaitErrorLog('waitresult: ', waitresult);
Log('Ready');

Log('Waiting for event 2');
WaitErrorLog('waitresult: ', waitresult);
waitresult := WaitForSingleObject(Event, INFINITE);
Log('Ready');


end;
----------------------------------------------------------------------------

Verwijderd

Misschien moet je je events korter op elkaar instellen. Een paar jaar terug gebruikte ik de IDirectSoundNotify interface ook (weliswaar in C++) , maar kwam er op een gegeven moment achter dat deze methode niet betrouwbaar was, met name als de events te kort op mekaar volgden. Toen ging ik handmatig in een aparte thread de play position pollen, en dat werkte beter.

Verwijderd

Topicstarter
Dat is nou net het probleem, die events staan op onveranderbare punten, die moeten per se op die punten staan.

Maar, dat pollen van jou, hoevaak per seconde doe je dat dan wel neit ? Ik ebdoel, een wavfile is 44,1 KHz, dus je zou met minimaal 44100 keer per seconde moeten pollen om PRECIES op het moment dat de buffer een bepaald punt (byte) heeft bereikt iets te kunnen doen (playposition veranderen).

Ik heb ook al geprobeerd om het event in te stellen op het laatstee deel vand e buffer, dus die 'gaat af ' als hij klaar is met spelen. Maar dat is helaas net iets erna. Ik wil juist dat meerdere buffers PRECIES na elkaar kunnen spelen. Hoe krijg je dat voor elkaar ?

  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
Dan worden de events niet 'wakker' en blijft hij steeds in de WaitForSingleObject hangne
Blijft ie dan al in de 1e event hangen?

Verwijderd

Maar, dat pollen van jou, hoevaak per seconde doe je dat dan wel neit ? Ik ebdoel, een wavfile is 44,1 KHz, dus je zou met minimaal 44100 keer per seconde moeten pollen om PRECIES op het moment dat de buffer een bepaald punt (byte) heeft bereikt iets te kunnen doen (playposition veranderen).
Zo nauwkeurig zal het nooit lukken, vooral niet met events. Maar ik weet niet waar je de code voor gebruikt. In mijn geval ging het erom dat bewerkte audio toegevoegd werd aan de output buffer (een circulaire) en dat moest gebeuren tussen sample n en sample n + 512 (ik noem maar wat). Op deze wijze kon ik toch nauwkeuriger werken dan met events en ik verwacht ook niet dat je met IDirectSoundNotify nauwkeuriger zal kunnen werken.

Verwijderd

Topicstarter
Ik maak een applicatie die zodra een MIDI NOTEON event binnenkomt een sample begint af te spelen, deze loopt tussen twee vastgelegde punten in de sample, en deze stopt zodra er een MIDI NOTEOFF event binnenkomt. Het wordt gebruikt als een soort synthesizer, er hangt een keyboard aan. Dus alles moet realtime. Maar het grappige is, er is ale een programmatje die dat doet, mbv DirectSound. Dus het kan wel. Maar hoe.. Ik wil het zelf ook maken.
Pagina: 1