Toon posts:

[C/C++] incorrect geluidsvolume

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een probleem met het replay volume van geluid:

Ik heb een programma wat geluid afspeelt wat hij in blokken van 2 seconden over TCP/IP binnenkrijgt (iedere 2 seconden komt er dus een blok binnen wat ook 2 seconden geluid bevat). Het geluid is opgenomen in VOX formaat, maar wordt on-the-fly geconverteerd naar ruw WAV (ADPCM formaat, dus geen codecs en zo nodig). Deze WAV buffers worden achter elkaar naar de geluidskaart geschreven d.m.v. een call naar WaveOutWrite(). Het allereerste buffer wordt 0.5 sec vertraagd voordat het naar de kaart geschreven wordt, dus alle volgende buffers komen binnen als het voorgaande buffer nog 0.5 seconde te gaan heeft.

Alles werkt heel leuk en aardig, maar er is het volgende probleem: als het geluidsnivo bij opname boven een bepaald nivo kwam, lijkt het wel alsof bij weergave het volume van het eerste buffer korrekt is, maar daarna wordt het afgeknepen tot een lager level. Het gekke is, dat als ik mijn programma de binnenkomende buffers laat dumpen naar een file, en deze file vervolgens afspeel m.b.v. CoolEdit, dan is het volume WEL over de volle lengte correct! Het enige verschil wat ik kan bedenken, is dat CoolEdit zo'n dumpfile als 1 groot buffer wegschrijft naar de geluidskaart (ca. 180 kB), en niet buffer voor buffer.

Bij een vergelijkbaar programma wat niet eerst converteert naar WAV maar de VOX buffers wegschrijft naar een telefonie-kaart doet zich precies hetzelfde verschijnsel voor! En de kaarten (zowel de standaard soundcard als die speciale telefoniekaart) moeten het geluidsnivo best aankunnen, want nogmaals: bij afspelen van de dumpfile via CoolEdit of een demoprogje wat bij die telefoniekaart hoort gaat het wel goed!

Iemand enig idee wat er aan de hand zou kunnen zijn?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

ADPCM is een gecomprimeerd formaat. Heeft het niet iets te maken met het feit dat een bepaalde sample afhankelijk is van de vorige samples, en dat je het geluid dus niet kunt opdelen in verschillende buffers?

Want de eerste sample van de 2e buffer is in principe afhankelijk van de vorige buffer, maar ik weet niet of de decompressie opnieuw wordt gestart bij het afspelen van een nieuwe buffer, of dat hij doorgaat "waar ie gebleven was"

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op 28 February 2003 @ 17:22:
ADPCM is een gecomprimeerd formaat. Heeft het niet iets te maken met het feit dat een bepaalde sample afhankelijk is van de vorige samples, en dat je het geluid dus niet kunt opdelen in verschillende buffers?

Want de eerste sample van de 2e buffer is in principe afhankelijk van de vorige buffer, maar ik weet niet of de decompressie opnieuw wordt gestart bij het afspelen van een nieuwe buffer, of dat hij doorgaat "waar ie gebleven was"
Kijk, dit snijdt hout! Dit lijkt mij een redelijk plausibele verklaring, .oisyn. Dat zou goed verklaren waarom buffered replay fout gaat, en dat file replay van de gedumpte buffers wel goed gaat.

Maar: (er is altijd een "maar" :) ) ik heb al eens een proefje gedaan door die buffers op te delen in kleinere buffers (delen door 32), en dat leek geen effekt te hebben. Dat strookt mijns inziens niet helemaal met de door jou gegeven verklaring.

Aan de andere kant: die telefonie-kaart kent behalve een buffer replay mode ook een streaming replay mode. Dat is volgens mij in principe hetzelfde als buffered replay (je levert het volgende buffer voordat het huidige buffer helemaal klaar is), maar in geval van streaming replay weet de kaart dat het volgende buffer op het huidige moet aansluiten... En die streaming replay loopt dus wel goed!

Voor die telefonie-kaart is de oplossing dus: streaming replay gebruiken. Voor de standaard soundcard kan dat dus niet, want de waveout library van MS kent geen streaming replay. Directx is geen oplossing, het moet echt via waveout. Dan blijft er denk ik maar 1 oplossing over (ervan uitgaande dat .oisyns verklaring de juiste is), en dat is een niet gecomprimeerd formaat gebruiken. Kan iemand mij vertellen waar ik een conversie-algorithme kan vinden van ADPCM naar niet gecomprimeerd formaat wat ook door een SoundBlaster en compatibles wordt begrepen? Of (nog beter) rechtstreeks van VOX naar een dergelijk formaat? Bestaat er een ongecomprimeerd WAV formaat?

Ik zal zelf ook gaan zoeken, maar hints worden hogelijk gewaardeerd!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het is een vrij simpel algoritme (en bovendien makkelijk te vinden met google ;) keywords: adpcm decompression)

ik kwam op deze site

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
misschien kun je DirectSound gebruiken? Dan ben je tenminste zeker dat de Soundcard het als 1 stream gaat aanzien...

Verwijderd

Topicstarter
hobbit_be schreef op 28 February 2003 @ 23:01:
misschien kun je DirectSound gebruiken? Dan ben je tenminste zeker dat de Soundcard het als 1 stream gaat aanzien...
Nee. Zoals ik al zei, het moet echt via de waveout library. Dit omdat het niet alleen op PC's moet kunnen draaien, maar ook op Compaq unix (na hercompileren natuurlijk), en die hebben een multimedia library die voor 95% compatible is met de MS waveout lib.

Anyway, met de suggestie van .oisyn en de websites die ik gevonden heb (ja ik was ook al aan het googlen geslagen), moet ik wel weer een paar dagen voort kunnen met experimenteren....

.oisyn, nogmaals bedankt voor je zeer nuttige hint!
Pagina: 1