iTunes-fouten (oorzaken en oplossingen). Audioprogrammering op laag niveau in Windows


Soms kunnen MME.browser en andere BROWSER systeemfouten kan gerelateerd zijn aan problemen in het Windowsregister. Verschillende programma's kunnen het bestand MME.browser gebruiken, maar wanneer deze programma's worden verwijderd of gewijzigd, blijven soms "zwevende" (onjuiste) BROWSER-registervermeldingen achter.

Kort gezegd betekent dit dat, hoewel het daadwerkelijke pad van het bestand mogelijk is gewijzigd, de onjuiste vorige locatie nog steeds in het Windows-register is vastgelegd. Wanneer Windows probeert deze onjuiste bestandsverwijzingen op te zoeken (locaties van bestanden op uw PC), kunnen MME.browser fouten optreden. Bovendien kan een malware-infectie registervermeldingen geassocieerd met Microsoft Windows beschadigd hebben. Deze beschadigde BROWSER-registervermeldingen moeten dus worden gerepareerd om het probleem bij de wortel op te lossen.

Handmatig bewerken van het Windows-register om ongeldige MME.browser sleutels te verwijderen wordt niet aanbevolen, tenzij u een professionele PC service-medewerker bent. Fouten bij het bewerken van het register kunnen ervoor zorgen dat uw pc onbruikbaar wordt en onherstelbare schade aan uw besturingssysteem veroorzaken. Zelfs één komma op de verkeerde plaats kan ervoor zorgen dat uw computer niet opstart!

Vanwege dit risico raden we het gebruik van een vertrouwde registratiereiniger aan zoals WinThruster (ontwikkeld door Microsoft Gold Certified Partner) aan om MME.browser -gerelateerde registratieproblemen te scannen en te repareren. Met behulp van een registeropschoner kunt u het proces automatiseren van het vinden van beschadigde registervermeldingen, ontbrekende bestandsverwijzingen (zoals degene die de MME.browser fout veroorzaakt) en verbroken koppelingen in het register. Vóór elke scan wordt automatisch een reservekopie gemaakt, zodat u eventuele wijzigingen met één klik ongedaan kunt maken en u bent beschermd tegen mogelijke schade aan uw computer. Het beste deel is dat het elimineren van registerfouten de systeemsnelheid en prestaties dramatisch kan verbeteren.


Waarschuwing: Tenzij u een ervaren pc-gebruiker bent, raden wij NIET aan om het Windows-register handmatig te bewerken. Als u de Register-editor verkeerd gebruikt, kan dit ernstige problemen veroorzaken, waardoor u mogelijk Windows opnieuw moet installeren. We garanderen niet dat problemen die voortkomen uit onjuist gebruik van de Register-editor kunnen worden gecorrigeerd. U gebruikt de Register-editor op eigen risico.

Voordat u handmatig het Windows-register herstelt, moet u een back-up maken door een gedeelte van het register geassocieerd met MME.browser te exporteren (bijv. Microsoft Windows):

  1. Klik op de knop Beginnen.
  2. Binnenkomen " commando"V zoekbalk... KLIK NOG NIET BINNENKOMEN!
  3. Terwijl je de toetsen ingedrukt houdt CTRL-Shift op uw toetsenbord, druk op BINNENKOMEN.
  4. Er wordt een dialoogvenster voor toegang weergegeven.
  5. Klik Ja.
  6. De zwarte doos wordt geopend met een knipperende cursor.
  7. Binnenkomen " regedit" en druk op BINNENKOMEN.
  8. In de Register-editor, selecteer de MME.browser-relateerde sleutel (bijv. Microsoft Windows) waarvan u een back-up wil maken.
  9. Op het menu Bestand selecteren Exporteren.
  10. Op de lijst Opslaan naar selecteer de map waarin u de Microsoft Windows-sleutelback-up wilt opslaan.
  11. In het veld Bestandsnaam Voer een naam in voor het back-upbestand, bijvoorbeeld 'Microsoft Windows Backup'.
  12. Zorg ervoor dat het veld Bereik exporteren waarde geselecteerd Geselecteerde vestiging.
  13. Klik Redden.
  14. Het bestand wordt opgeslagen met extensie .reg.
  15. U heeft nu een backup van uw MME.browser-gerelateerde registervermelding.

De volgende stappen voor het handmatig bewerken van het register worden in dit artikel niet beschreven, omdat deze uw systeem waarschijnlijk beschadigen. Als u meer informatie wilt over het handmatig bewerken van het register, bekijk dan de onderstaande links.

Op verzoek van het programma kan het geluidssubsysteem drie meldingsopties gebruiken: het instellen van een programmagebeurtenisobject (event), het aanroepen van een gespecificeerde programmafunctie (callback), of het verzenden van een bericht naar een gespecificeerd venster of taak (thread). In de eerste versie ontvangt het programma alleen informatie over het feit van een gebeurtenis in het geluidssubsysteem en moet het zelf uitzoeken wat er precies is gebeurd; bij de tweede en derde optie worden de gebeurteniscode en verduidelijkende informatie verzonden.

Het geluidssubsysteem verzendt meldingen naar het programma over drie soorten gebeurtenissen: succesvol openen van het apparaat, succesvol sluiten van het apparaat en voltooiing van het verwerken van de volgende buffer uit de wachtrij van het stuurprogramma. Strikt genomen is alleen de laatste gebeurtenis volledig asynchroon; de eerste twee vinden onmiddellijk na het succesvol openen en sluiten van het apparaat plaats en worden naar het programma overgedragen, zelfs voordat ze terugkeren van de overeenkomstige interfacefuncties.

Melding door een bericht naar een venster of taak te sturen

Het geluidssubsysteem stuurt een Windows-bericht naar een opgegeven venster of taak, waarvan de code de gebeurtenis weergeeft die heeft plaatsgevonden, waarbij de berichtparameters de sleutel van het open geluidsapparaat en aanvullende informatie over de gebeurtenis worden doorgegeven. Het bericht wordt asynchroon verzonden met behulp van functies Postbericht of PostThreadbericht en wordt samen met andere Windows-berichten geselecteerd uit het venster of de takenwachtrij.

De namen van de constanten voor berichtcodes hebben de vorm MM_WxM_gebeurtenis, Waar X- apparaattype (letter I- voor een invoerapparaat of O- voor het uitvoerapparaat), en evenement- evenementtype:

Berichten MM_BxM_OPEN En MM_BxM_CLOSE worden naar apparaten van beide typen verzonden, en MM_WIM_DATA En MM_WOM_DONE- alleen voor respectievelijk invoer- of uitvoerapparaten.

In alle berichten wordt de parameter wParam verzendt de sleutel van het apparaat dat de gebeurtenis heeft gegenereerd. In berichten GEGEVENS/KLAAR parameter lParam geeft een headeraanwijzer door naar de geretourneerde audiobuffer.

Berichten van het audiosubsysteem vereisen geen retourwaarde van de functie die ze verwerkt.

Melding door het aanroepen van een softwarefunctie

Het geluidssubsysteem roept een bepaalde softwarefunctie aan en geeft gebeurteniscode en parameters door als argumenten. Het prototype van de aangeroepen functie heeft de volgende vorm:

void CALLBACK CallbackProc (HWAVEx-handle, UINT-bericht, DWORD-instantie, DWORD Param1, DWORD Param2);

Hendel- geluidsapparaatsleutel. Heeft een soort HWAVEIN of HWAVEOUT; het is toegestaan ​​om een ​​generiek type te gebruiken HWAVE.

Bericht- gebeurteniscode. Constanten voor gebeurteniscodes hebben dezelfde namen als constanten voor berichtcodes voor vensters/taken, maar zonder het voorvoegsel MM_ (WIM_OPEN, WOM_DONE enz.). In feite zijn ze nu gedefinieerd in MMSYSTEEM.H als equivalent aan constanten met een voorvoegsel MM_ Hier moet u in de toekomst echter niet op rekenen.

Aanleg- 32-bits informatiewoord gespecificeerd door het programma bij het openen van het apparaat. Het audiosubsysteem gebruikt deze waarde op geen enkele manier, maar geeft deze alleen door bij elke functieaanroep.

Param1, Param2- gebeurtenisparameters. Voor evenementen OPEN En DICHTBIJ betekenis Param1 gelijk aan nul; voor evenementen GEGEVENS En KLAAR deze parameter geeft de headeraanwijzer door aan de geretourneerde audiobuffer. Betekenis Param2 in de huidige implementatie is dit altijd nul.

De functie kan worden aangeroepen in de context van een interrupt-handler, zodat deze veilig slechts een beperkt aantal Windows-functies kan gebruiken: EnterCriticalSection, Verlaat de kritische sectie, midiOutLongMsg, midiOutShortMsg, OutputDebugString, Postbericht, PostThreadbericht, SetEvent, timeGetSystemTime, tijdGetTime, timeKillEvent, timeSetEvent.

Toegang tot andere systeemfuncties, evenals de functies van het audiosubsysteem, kan onvoorspelbare gevolgen hebben.

Om een ​​functie aan te roepen, creëert het geluidssubsysteem een ​​aparte taak (thread) met een hogere (ABOVE_NORMAL) prioriteit. In tegenstelling tot het doorgeven van berichten, die in volgorde worden verwerkt, vindt het aanroepen van een functie parallel plaats met het werk van andere taken in het proces. Er moet dus voor worden gezorgd dat de toegang van de functie en andere taken tot gedeelde variabelen en datastructuren wordt gesynchroniseerd.

Een hulptaak ​​wordt één keer aangemaakt en blijft bestaan ​​totdat het proces is voltooid. Het audiosubsysteem roept vanuit deze taak meldingsfuncties op voor alle apparaten die tijdens de levensduur van het proces open zullen zijn.

Een set interfacefuncties voor audioapparaten In wat volgt zullen we ons houden aan een universeel systeem voor het benoemen van functies, waarbij alleen het semantische deel van de naam wordt aangegeven en het voorvoegsel met het type en de “oriëntatie” van het apparaat wordt weggelaten. Als we het bijvoorbeeld hebben over de GetDevCaps-functie, bedoelen we twee functies: En waveInGetDevCaps waveOutGetDevCaps , waarbij alleen hun verschillen voor invoer- en uitvoerapparaten worden uitgelegd. Dit vereist van de lezer dat hij in elk specifiek geval de volledige naam van de functie 'construeert', maar maakt het mogelijk dat de beschrijving breder en systematischer wordt. In het functieprototype wordt het voorvoegsel aangegeven met de reeks "».

xxx HWAVEIN of HWAVEOUT De eerste parameter van de meeste functies specificeert de sleutel (handvat) van het open geluidsapparaat, dat het type heeft ; in het prototype wordt het type aangegeven HWAVEx HWAVE.

. Zoals reeds vermeld, kunnen sleutels van audioapparaten worden opgeslagen in variabelen van een compatibel type

Lijst met interfacefuncties

Aantal apparaten aanvragen

Vraag apparaatparameters en -mogelijkheden aan

Het apparaat openen

Het apparaat sluiten

Het voorbereiden (vastzetten in het geheugen) van de geluidsbuffer

De audiobuffer vrijmaken (ontgrendelen).

Buffer toevoegen/schrijven

De volgende buffer wordt overgezet naar het apparaatstuurprogramma

Stop met opnemen/afspelen

Start het opnemen/afspelen

Draad opnieuw instellen

SetVolume/GetVolume

Afspeelvolume instellen/opvragen

Toonhoogte instellen/opvragen tijdens het afspelen

SetPlaybackRate/GetPlaybackRate

Afspeelsnelheid instellen/opvragen

Apparaatnummer opvragen met sleutel

Foutmeldingstekst per code opvragen

Een niet-standaard bericht naar de chauffeur sturen

Waarden geretourneerd door interfacefuncties

Op enkele uitzonderingen na retourneren alle audio-interfacefuncties een resultaat van het type MMRESULTAAT, gelijk aan type UINT. Betekenis MMSYSERR_NOERROR, in de huidige implementatie gelijk aan nul, betekent dat de functie succesvol is uitgevoerd. Elke andere waarde duidt op een fout. Constanten voor foutcodes hebben voorvoegsels MMSYSERR_(algemene fout in het multimediasubsysteem) en WAVERR_(Fout met stuurprogramma Wave-apparaat):

MMSYSERR_BADDEVICEID

Ongeldig apparaatnummer

MMSYSERR_NOTENABLED

Bestuurder niet geactiveerd

MMSYSERR_ALLOCATED

Het apparaat is bezig met een andere applicatie

MMSYSERR_INVALHANDLE

Ongeldige geopende apparaatsleutel

MMSYSERR_NODRIVER

Bestuurder ontbreekt

Niet genoeg geheugen

MMSYSERR_NOTSUPPORTED

De gevraagde functie wordt niet ondersteund

MMSYSERR_BADERRNUM

Foutcode buiten bereik

MMSYSERR_INVALFLAG

Ongeldige vlag

MMSYSERR_INVALPARAM

Ongeldige parameter

MMSYSERR_HANDLEBUSY

Er wordt een bewerking op de sleutel uitgevoerd vanuit een andere taak

Ongespecificeerde fout

MMSYSERR_NODRIVERCB

De chauffeur heeft de meldingen niet uitgevoerd (terugbellen)

WAVERR_BADFORMAT

Ongeldig of niet-ondersteund streamformaat

WAVERR_STILL SPEELT

Opname of weergave bezig

WAVERR_UNPREPARED

Buffer niet voorbereid

Het apparaat werkt alleen in de synchrone modus

GetDevCaps - vraag apparaatparameters en -mogelijkheden aan

MMRESULT xxxGetDevCaps(UINT DevId, LPWAVExCAPS Caps, UINT CapsSize);

Wordt gebruikt om de parameters en mogelijkheden van het apparaat te bepalen.

DevId- apparaatnummer beginnend bij nul, of de sleutel van een eerder geopend apparaat, of een constante WAVE_MAPPER. In het laatste geval worden de parameters van het standaardsysteemapparaat geretourneerd.

Doppen- verwijzing naar een structuur van het type WAVEINCAPS of WAVEOUTCAPS (er zijn speciale typen LPWAVEINCAPS En LPWAVEOUTCAPS).

CapsMaat- grootte van de structuur in bytes.

Na succesvolle voltooiing vult de functie de velden van de structuur die door de aanwijzer worden doorgegeven met apparaatparameters. Als er parameters zijn gevraagd Golf Mapper, vervolgens wordt de naam van de omleidingsservice geretourneerd als de apparaatnaam.

Openen - het apparaat openen

MMRESULT xxxOpen (LPHWAVEx ForHandle, UINT DevId, LPCWAVEFORMATEX-indeling, DWORD-callback, DWORD-instantie, DWORD OpenFlags);

VoorHandvat- typ variabele aanwijzer HWAVEIN of HWAVEOUT(wijzertype - LPHWAVEIN of LPHWAVEOUT), waarin, na succesvolle voltooiing van de bewerking, de sleutel van het open apparaat wordt geschreven.

DevId- apparaatnummer beginnend bij nul, of de sleutel van een eerder geopend apparaat, of de waarde WAVE_MAPPER. In het laatste geval selecteert de omleidingsservice een apparaat dat het opgegeven formaat ondersteunt, en begint de zoekopdracht met het standaardsysteemapparaat.

Formaat- verwijzing naar een WAVEFORMATEX-typestructuur die het vereiste streamformaat beschrijft.

Terugbellen- een object waarnaar bestuurdersmeldingen over de uitvoering van gevraagde handelingen worden verzonden. Gespecificeerd door de venster- of gebeurtenissleutel (handle), functieaanwijzer of taakidentificatie (thread-ID).

Aanleg- een 32-bits informatiewoord dat door de bestuurder wordt verzonden in de parameters van de meldingsfunctieoproep. Bij het ontwikkelen van een generieke interface met audioapparaten kan dit bijvoorbeeld een verwijzing zijn naar een apparaathandle (structuur- of klasseobject).

OpenVlags- vlaggen van openings- en bedrijfsmodi van het apparaat:

De bestuurder zal het programma niet op de hoogte stellen wanneer er bewerkingen worden uitgevoerd. Deze modus is de standaard

Parameter Terugbellen is de sleutel van het gebeurtenisobject (gebeurtenishandvat)

Parameter Terugbellen is de thread-ID

Parameter Terugbellen is de venstersleutel

CALLBACK_FUNCTION

Parameter Terugbellen is een functieaanwijzer

WAVE_FORMAT_QUERY

Formaat polling-modus. Het stuurprogramma controleert alleen of het opgegeven apparaat kan worden geopend met het gevraagde formaat en de gevraagde modi, en retourneert de juiste resultaatcode. In deze modus wordt de parameter VoorHandvat kan nul zijn ( NUL)

WAVE_FORMAT_DIRECT

Voorkomt dat Wave Mapper en ACM deelnemen aan de conversie van streamformaten. Alle gegevensuitwisseling vindt uitsluitend plaats tussen de bestuurder en de applicatie

Hiermee kan het apparaat in synchrone modus worden geopend. Voor volledig synchrone apparaten moet deze vlag worden opgegeven

Zorgt ervoor dat Wave Mapper en ACM de uitwisseling van audiogegevens tussen het programma en het apparaatstuurprogramma kunnen verstoren

Als het apparaat succesvol is geopend (als de formaatpolling-vlag niet is ingesteld), keert het geluidssubsysteem terug naar de variabele waarnaar wordt verwezen door de aanwijzer VoorHandvat, de sleutel (handvat) van een open apparaat.

Invoerapparaten gaan open in de stopmodus en het doorgeven van audiobuffers aan de bestuurder begint niet automatisch met opnemen - hiervoor moet u de Start-functie oproepen. Uitvoerapparaten worden onmiddellijk geopend in de afspeelmodus en wanneer de eerste audiobuffer naar het stuurprogramma wordt overgebracht, begint het afspelen automatisch.

Wanneer u klaar bent met werken met een apparaat, moet u het afsluiten met de functie Sluiten, anders kan het geopende apparaat vastlopen. In tegenstelling tot het bestandssubsysteem is het geluidssubsysteem in Windows veel gevoeliger voor fouten en kan het niet altijd de beëindiging van het programma volgen om geluidsapparaten te laten crashen.

PrepareHeader - het voorbereiden van de buffer en de header ervan voor verzending naar de bestuurder

MMRESULT xxxPrepareHeader (HWAVEx-handgreep, LPWAVEHDR Hdr, UINT HSize);

HDR

H-grootte

Bereidt de audiobuffer voor op verzending naar de bestuurder. Normaal gesproken bestaat de voorbereiding uit het vastleggen van de buffer in het geheugen, zodat deze tijdens een off-process transfer (DMA) niet uiteindelijk naar de schijf wordt verwijderd (weggepompt). Het audiosubsysteem stelt de vlag in de header van de voorbereide buffer in WHDR_PREPARED.

Voordat de functie wordt aangeroepen, moeten de velden in de bufferheader worden ingevuld lpgegevens, dwBufferLengte, dwFlags.

Voor een reeds voorbereide buffer voert de functie geen enkele actie uit en wordt deze met succes voltooid.

Write/AddBuffer - overdracht van de audiobuffer naar het stuurprogramma

MMRESULT waveOutWrite (HWAVEx-handgreep, LPWAVEHDR Hdr, UINT HSize); MMRESULT waveInAddBuffer (HWAVEx-handgreep, LPWAVEHDR Hdr, UINT HSize);

HDR- audiobuffer header-indicator.

H-grootte- Grootte van de headerstructuur.

Geeft de audiobuffer door aan het stuurprogramma voor weergave ( Schrijven) of om te schrijven ( Buffer toevoegen). De buffer moet worden voorbereid met behulp van de functie Prepare, anders weigert de chauffeur deze te accepteren.

Na ontvangst van de buffer reset de driver de WHDR_DONE-vlag in zijn header, neemt de header op in de interne wachtrij en stelt de WHDR_INQUEUE-vlag in. Hierna geeft de asynchrone driver de controle terug aan de applicatie, waarbij de parallelle verwerking van de bufferwachtrij wordt voortgezet op basis van apparaatonderbrekingen; De synchrone driver geeft de controle pas terug nadat de verwerking van de buffer is voltooid.

Nadat de verwerking van de volgende buffer is voltooid, verwijdert het stuurprogramma deze uit de wachtrij, reset de vlag WHDR_INQUEUE, stelt vervolgens de vlag WHDR_DONE in en stelt vervolgens de toepassing op de hoogte als hierom werd gevraagd bij het openen van het apparaat. Het stuurprogramma gaat vervolgens verder met het verwerken van de volgende buffer in de wachtrij.

De applicatie mag geen headervelden wijzigen totdat het stuurprogramma de buffer heeft verwerkt.

Omdat de bufferheader slechts één veld heeft om aan een lijst te binden, resulteert het opnieuw indienen van een buffer die al in de wachtrij staat bij het stuurprogramma in een fout.

Start/Herstart - start opnemen/afspelen

MMRESULT waveInStart(HWAVEx-handgreep); MMRESULT waveOutRestart(HWAVEx-handgreep); Start het opnemen/afspelen vanaf de huidige streampositie.

Wanneer de thread actief is, voert de functie geen enkele actie uit en wordt deze met succes voltooid.

BreakLoop - onderbreek de huidige lus

MMRESULT waveOutBreakLoop (HWAVEx-handgreep);

Reset de afspeellusmodus, indien ingesteld. De huidige lusdoorgang wordt tot het einde afgespeeld en vervolgens gaat het afspelen lineair verder, zonder terug te keren naar de eerste lusbuffer. Een groep lusbuffers wordt teruggestuurd naar het programma zodra elke lus het afspelen voltooit.

Wanneer de thread wordt gestopt of er geen lus is, doet de functie niets en wordt deze met succes voltooid.

SetVolume - het afspeelvolume instellen

MMRESULT waveOutSetVolume (HWAVEx-handgreep, DWORD-volume);

Volume- volume op de linker- en rechterkanalen. Het lage woord bepaalt het volume van het linkerkanaal, het hoge woord bepaalt het volume van het rechterkanaal. De waarde 0xFFFF stelt het maximale volume in, 0 - het minimum. Voor adapters die geen onafhankelijke volumeregeling per kanaal ondersteunen, stelt het lage woord het volume in beide kanalen van het pad in.

Met deze functie wordt het uitgangsniveau van het gereproduceerde signaal ingesteld. Hoewel de functie 65.536 volumeniveaus mogelijk maakt, ondersteunen de meeste adapters slechts tussen de 8 en 256 niveaus. In dergelijke gevallen zijn alleen de drie tot acht meest significante cijfers van de luidheidswaarde significant;

Met deze interpretatie kunt u dezelfde volumeschaal gebruiken, waarbij alleen de mate van stapaanpassing wordt gewijzigd.

De functie wordt alleen ondersteund door adapters waarvan de eigenschappen de vlag WAVECAPS_VOLUME hebben ingesteld. Afzonderlijke aanpassing per kanaal wordt alleen ondersteund als de vlag WAVECAPC_LRVOLUME aanwezig is.

SetPitch / SetPlaybackRate - instelling van de toonhoogte / afspeelsnelheid MMRESULT waveOutSetPitch (HWAVEx-handgreep, DWORD-multiplier); MMRESULT waveOutSetPlaybackRate (HWAVEx-handle, DWORD-multiplier); Vermenigvuldiger - Vermenigvuldiger van toonhoogte/afspeelsnelheid. Het hoge woord specificeert het gehele deel van de vermenigvuldiger, het lage woord specificeert het fractionele deel. Als er een vermenigvuldigingswaarde is F type dubbele en converteer het vervolgens naar type DWORD

kan gedaan worden met behulp van de formule:

Vermenigvuldiger = (DWORD)(f * 0x10000)

Wanneer je de toonhoogte verandert, worden alle geluiden in de stream hoger of lager, maar de duur van elk geluid en de totale speelduur blijven behouden. Het wijzigen van de afspeelsnelheid is vergelijkbaar met het wijzigen van de snelheid van een band in een bandrecorder: alle geluiden worden hoger of lager en de totale afspeeltijd neemt dienovereenkomstig af of toe.

Niet alle geluidsadapters ondersteunen dit paar functies; in de regel wordt het geïmplementeerd op gespecialiseerde signaalprocessors (DSP). Technisch gezien is de eenvoudigste manier om een ​​snelheidsverandering te implementeren dit te bereiken door tussenmonsters te interpoleren die elkaar vaker of minder vaak volgen op de punten tussen bestaande monsters, die naar het DAC-circuit worden gestuurd. Het veranderen van de toonhoogte vereist veel complexere berekeningen: fragmenten van de stroom worden ontleed in een Fourier-reeks, waardoor een spectrum van geluid ontstaat, vervolgens wordt het spectrum verschoven naar hoge of lage frequenties, waarna er weer een fragment van een nieuwe geluidsstroom wordt gevormd. het veranderde spectrum.

Voor adapters die pitch- en/of snelheidsveranderingen ondersteunen, stelt de GetDevCaps-functie respectievelijk de vlaggen WAVECAPS_PITCH en WAVECAPS_PLAYBACKRATE in.

GetID - vraag het apparaatnummer op via de sleutel

MMRESULT xxxGetID (HWAVEx-handgreep, LPUINT ForID);

Voor ID- typ variabele aanwijzer UINT, waarin het apparaatnummer wordt ingevoerd.

De functie bepaalt het nummer van het apparaat. Bij opening retourneerde het systeem de opgegeven sleutel. Als de omleidingsservice werd gebruikt bij het openen (value WAVE_MAPPER in plaats van een getal of de vlag WAVE_MAPPED), retourneert de functie de waarde WAVE_MAPPER.

Microsoft-documentatie beweert dat deze functie alleen wordt ondersteund om compatibiliteitsredenen en dat het enige dat u hoeft te doen om het nummer te krijgen, de sleutel naar het juiste type is, maar dit is helemaal niet het geval. De open apparaatsleutel is het adres van een descriptor die tot het audiosubsysteem behoort en bevindt zich in Win32 in een gedeeld geheugengebied. De enige manier om het apparaatnummer per sleutel te verkrijgen, is door de functie te gebruiken.

GetID

GetErrorText - vraag een sms-foutmelding aan via code

MMRESULT xxxGetErrorText(MMRESULT-fout, LPSTR-tekst, UINT-tekstgrootte); Fout

- foutcode geretourneerd door een van de interfacefuncties; Tekst - verwijzing naar een tekstbuffer (array van type);

verkoold Tekstgrootte

De functie schrijft een tekstbeschrijving van de fout met de opgegeven code naar de opgegeven buffer. De geschreven tekst wordt afgesloten met een null-byte. Als de buffer niet groot genoeg is, wordt het einde van de tekst afgesneden; de nulbyte wordt in ieder geval naar de buffer geschreven..

De grootte van de buffer die eventuele foutmeldingen kan opvangen, wordt bepaald door de constante MAXERROLENGTE.

Foutmeldingen zijn niet per apparaattype gescheiden, dus om de tekst van een eventuele fout op te vragen is bijvoorbeeld één van de mogelijke functies voldoende

waveOutGetErrorText

Bericht Bericht - stuur een bericht naar de chauffeur

MMRESULT xxxBericht (HWAVEx-handle, UINT-bericht, DWORD P1, DWORD P2);, - code van het verzonden bericht. P1

P2 en converteer het vervolgens naar type- berichtparameters. De functie wordt gebruikt om direct een bericht naar de chauffeur te sturen. Alle interfacefuncties, behalve GetID en GetErrorText, worden door het audiosubsysteem vertaald in berichten die naar de bestuurder worden verzonden; elk bericht heeft twee parameters van het type, waarin de parameters van interfacefuncties worden omgezet. Als het apparaatstuurprogramma niet-standaardberichten ondersteunt, kunnen deze met behulp van de functies ernaar worden verzonden

Bericht

. De retourwaarde wordt door de chauffeur zelf bepaald.

Nadelen van het MME-audiosubsysteem In Windows 95/98 bleven het MME-subsysteem en de stuurprogramma's 16-bit, net als in Windows 3.x. Hierdoor gaat elke aanroep van de geluidsdriver vanuit een Win32-applicatie gepaard met een dubbele wijziging van de uitvoeringsmodus (thunking), wat helaas leidt tot extra overhead, die op Celeron-366-processors tot enkele milliseconden kan oplopen. Bovendien beperken veel stuurprogramma's de updatesnelheid van de ringbuffer, waarmee de uitwisseling tussen de computer en de adapter plaatsvindt, tot enkele tientallen keren per seconde, wat een vertraging (latentie) veroorzaakt in het proces van audiotransmissie. Voor stuurprogramma's voor ISA-adapters kan deze vertraging tientallen milliseconden bedragen; voor stuurprogramma's voor PCI-adapters is deze doorgaans beperkt tot enkele milliseconden. Voor snellere geluidsuitvoer, vooral met realtime modificatie, heeft Microsoft een nieuwe interface ontwikkeld - In Windows 95/98 bleven het MME-subsysteem en de stuurprogramma's 16-bit, net als in Windows 3.x. Hierdoor gaat elke aanroep van de geluidsdriver vanuit een Win32-applicatie gepaard met een dubbele wijziging van de uitvoeringsmodus (thunking), wat helaas leidt tot extra overhead, die op Celeron-366-processors tot enkele milliseconden kan oplopen. Bovendien beperken veel stuurprogramma's de updatesnelheid van de ringbuffer, waarmee de uitwisseling tussen de computer en de adapter plaatsvindt, tot enkele tientallen keren per seconde, wat een vertraging (latentie) veroorzaakt in het proces van audiotransmissie. Voor stuurprogramma's voor ISA-adapters kan deze vertraging tientallen milliseconden bedragen; voor stuurprogramma's voor PCI-adapters is deze doorgaans beperkt tot enkele milliseconden. DirectGeluid

Voor een efficiënte werking is de interface In Windows 95/98 bleven het MME-subsysteem en de stuurprogramma's 16-bit, net als in Windows 3.x. Hierdoor gaat elke aanroep van de geluidsdriver vanuit een Win32-applicatie gepaard met een dubbele wijziging van de uitvoeringsmodus (thunking), wat helaas leidt tot extra overhead, die op Celeron-366-processors tot enkele milliseconden kan oplopen. Bovendien beperken veel stuurprogramma's de updatesnelheid van de ringbuffer, waarmee de uitwisseling tussen de computer en de adapter plaatsvindt, tot enkele tientallen keren per seconde, wat een vertraging (latentie) veroorzaakt in het proces van audiotransmissie. Voor stuurprogramma's voor ISA-adapters kan deze vertraging tientallen milliseconden bedragen; voor stuurprogramma's voor PCI-adapters is deze doorgaans beperkt tot enkele milliseconden. moet worden ondersteund door het systeemadapterstuurprogramma. Voor apparaten waarvan de stuurprogramma's dit niet ondersteunen In Windows 95/98 bleven het MME-subsysteem en de stuurprogramma's 16-bit, net als in Windows 3.x. Hierdoor gaat elke aanroep van de geluidsdriver vanuit een Win32-applicatie gepaard met een dubbele wijziging van de uitvoeringsmodus (thunking), wat helaas leidt tot extra overhead, die op Celeron-366-processors tot enkele milliseconden kan oplopen. Bovendien beperken veel stuurprogramma's de updatesnelheid van de ringbuffer, waarmee de uitwisseling tussen de computer en de adapter plaatsvindt, tot enkele tientallen keren per seconde, wat een vertraging (latentie) veroorzaakt in het proces van audiotransmissie. Voor stuurprogramma's voor ISA-adapters kan deze vertraging tientallen milliseconden bedragen; voor stuurprogramma's voor PCI-adapters is deze doorgaans beperkt tot enkele milliseconden. emuleert Windows de nieuwe interface “bovenop” het reguliere MME-stuurprogramma, maar in dit geval nemen alle vertragingen zelfs toe vanwege de overhead van emulatie.

Helaas heeft Microsoft de extensiespecificatie ontwikkeld In Windows 95/98 bleven het MME-subsysteem en de stuurprogramma's 16-bit, net als in Windows 3.x. Hierdoor gaat elke aanroep van de geluidsdriver vanuit een Win32-applicatie gepaard met een dubbele wijziging van de uitvoeringsmodus (thunking), wat helaas leidt tot extra overhead, die op Celeron-366-processors tot enkele milliseconden kan oplopen. Bovendien beperken veel stuurprogramma's de updatesnelheid van de ringbuffer, waarmee de uitwisseling tussen de computer en de adapter plaatsvindt, tot enkele tientallen keren per seconde, wat een vertraging (latentie) veroorzaakt in het proces van audiotransmissie. Voor stuurprogramma's voor ISA-adapters kan deze vertraging tientallen milliseconden bedragen; voor stuurprogramma's voor PCI-adapters is deze doorgaans beperkt tot enkele milliseconden. voor audio VxD alleen in termen van audioweergave, waarbij primair in het belang van de gamefabrikanten wordt gehandeld. Geluid opnemen via In Windows 95/98 bleven het MME-subsysteem en de stuurprogramma's 16-bit, net als in Windows 3.x. Hierdoor gaat elke aanroep van de geluidsdriver vanuit een Win32-applicatie gepaard met een dubbele wijziging van de uitvoeringsmodus (thunking), wat helaas leidt tot extra overhead, die op Celeron-366-processors tot enkele milliseconden kan oplopen. Bovendien beperken veel stuurprogramma's de updatesnelheid van de ringbuffer, waarmee de uitwisseling tussen de computer en de adapter plaatsvindt, tot enkele tientallen keren per seconde, wat een vertraging (latentie) veroorzaakt in het proces van audiotransmissie. Voor stuurprogramma's voor ISA-adapters kan deze vertraging tientallen milliseconden bedragen; voor stuurprogramma's voor PCI-adapters is deze doorgaans beperkt tot enkele milliseconden. wordt nog steeds uitgevoerd door emulatie bovenop MME.

Het moet gezegd worden dat het geluidssubsysteem van Windows 3.x en 95/98, evenals het externe toegangsubsysteem (RAS), een lage fouttolerantie heeft. Dit komt meestal tot uiting in het feit dat wanneer een programma dat geluidsapparaten opent en ermee werkt, crasht, het systeem de gebruikte apparaten niet correct sluit (opruimt). Als gevolg hiervan kan het in sommige gevallen nodig zijn om na een dergelijke crash opnieuw op te starten, en tot die tijd zijn ontgrendelde apparaten niet toegankelijk voor andere applicaties. Bovendien zijn 16-bits subsystemen veel minder beschermd tegen fouten dan 32-bits subsystemen, dus ernstige fouten in geluidsprogramma's kunnen leiden tot crashes en vastlopen van het hele Windows-systeem.

In Windows NT zijn alle subsystemen aanvankelijk 32-bits gemaakt, dus de beschreven problemen doen zich daar niet voor. Audio-invoer- en uitvoervertragingen worden echter nog steeds bepaald door de updatesnelheid van de ringbuffer, die wordt ingesteld door de driver van een bepaalde adapter.

Voorbeeldprogramma met behulp van de MME-interface

Ter illustratie wordt een programma gegeven dat het vertragingseffect in realtime implementeert. De essentie van het effect is de toevoeging van het originele geluidssignaal aan de kopie, in de tijd vertraagd met een kleine hoeveelheid (enkele tot honderden milliseconden). Een vertraging van maximaal 15-20 ms wordt op het gehoor waargenomen als een “verplettering” van de geluidsbron; Op dit principe is het creëren van een kooreffect gebaseerd. Een vertraging van 20-50 ms wordt waargenomen als galm (een gevoel van volume), en grotere vertragingen worden waargenomen als een normale echo.

Om een ​​geloofwaardig geluid uit de beschreven effecten te verkrijgen, is het gebruikelijk om meerdere opeenvolgende audiovertragingen te maken waarin een kopie van het originele signaal geleidelijk wordt verzwakt. In het bovenstaande programma wordt eenvoudigheidshalve slechts één vertraging gemaakt en wordt de kopie van het signaal niet verzwakt.

Het programma is geïmplementeerd in C++. In feite werden er alleen algemene extensies uit C++ in gebruikt (variabelen definiëren in lusheaders, structuurnamen gebruiken als typenamen, enz.), anders kunnen we ervan uitgaan dat het de reguliere ANSI C-taal gebruikte.

Het programma is ontwikkeld in de MS VC++ 4.2-omgeving. Er wordt uitsluitend gebruik gemaakt van de standaard Windows-interface, zonder uitbreidingen uit de ontwikkelomgeving.

Het programma werkt in realtime en opent tegelijkertijd twee geluidsapparaten: invoer en uitvoer. Gevulde audiobuffers die afkomstig zijn van het invoerapparaat worden opgeteld met hun in de tijd verschoven kopieën en vervolgens naar het uitvoerapparaat gestuurd; Eén gemeenschappelijke set audiobuffers circuleert tussen de invoer- en uitvoerapparaten.

Om de circulatie van buffers te beheren, wordt een afzonderlijke werktaak (werkthread) gemaakt, waaraan de maximale prioriteitsverhoging wordt toegewezen. Geluidsapparaten worden geopend in de meldingsmodus voor werktaken.

Door buffering loopt het geluid van het programma iets achter op het originele geluid.

De totale buffertijd en het aantal geluidsbuffers worden ingesteld in de sectie programmaparameters. Voor continue audio-overdracht mag het aantal buffers niet minder dan twee zijn; aanvaardbare stabiliteit wordt bereikt, zelfs bij gebruik van drie of vier buffers.

Om het programma te laten werken, heb je een full-duplex audioadapter nodig die de gelijktijdige werking van de ADC en DAC mogelijk maakt. De meeste moderne adapters voldoen aan deze voorwaarde.

Voorbeeld

ComputerPress 6"2000
Bewerken > Voorkeuren > Audiohardware. Het tabblad: Audio Hardware is bedoeld voor het beheren van hardware-audioapparaten. Wanneer audioapparatuur is aangesloten, laadt dit dialoogvenster de hardware-instellingen voor dat apparaattype, zoals standaardinvoer, standaarduitvoer, hoofdklok, latentie en bemonsteringsfrequentie. Apparaatklasse
Het verdient de voorkeur om ASIO- en CoreAudio-stuurprogramma's te gebruiken, omdat deze een hogere efficiëntie en lagere latentie bieden. U kunt ook audio monitoren tijdens het opnemen en tijdens het afspelen direct volume-, panning- en effectwijzigingen zien.
*Deze optie is belangrijk omdat we een gewone audiocodec gebruiken en als op dit punt het ASIO-stuurprogramma is geselecteerd in plaats van MME. Als u vervolgens op de tijdlijn op de afspeelknop drukt, start het afspelen niet.
Standaardinvoer: Geen ingangssignaal.
*Als u met hogere snelheid op de tijdlijn afspeelt (of als de afspeel- en afspeelkop met sprongen beweegt, het geluid stottert, enz.), en de fout verschijnt: Audiohardware I/O overbelast om 00:00:00:001 in "Adobe Player".

Of we ontvangen de melding: Interne MME-apparaatfout. Audiohardware-instellingen openen?
Wanneer de apparaatklasse vervolgens is ingesteld: MME (niet ASIO), selecteert u in de vervolgkeuzelijst Standaardinvoer: geen invoer, in plaats van Digitale Audio (S/PDIF) (Sound Blaster X-Fi Xtreme Audio) of Microfoon ( Realtek High Definition Audio) (werkt niet) / Microfoon (Realtek High Definition Audio) (werkt niet), of FrontMic (Realtek High Definition Audio) (werkt niet).


Standaarduitvoer:

Meesterklok. Voor Master Clock selecteert u de ingang of uitgang waarmee u andere digitale audioapparatuur wilt synchroniseren (voor nauwkeurige sample-matching).
Latentie. Geef voor I/O-buffergrootte (ASIO en CoreAudio) of Latency (MME) de laagst mogelijke waarde op die geen audio-uitval veroorzaakt. De ideale waarde hangt af van de snelheid van het systeem en moet dus experimenteel worden gevonden.

De bemonsteringsfrequentie voor audioapparatuur selecteren.
*Als u een andere frequentie dan 48 kHz heeft ingesteld, of als u Standaardinvoer: Microfoon (Realtek High Definition Audio) selecteert, zijn er twee waarden: invoer 44100 Hz/uitvoer 96000 Hz, dan kunnen er problemen zijn met het afspelen op de tijdlijn van Adobe Première Pro CC 2015.
Klik op de knop: Instellingen... (Instellingen). Er verschijnt een venster: Geluid met een tabblad - Afspelen. Hier kunt u het afspeelapparaat selecteren waarvan u de instellingen wilt wijzigen.

Bladwijzer: opnemen.

Bladwijzer: Geluiden. Het geluidsschema specificeert de geluiden die gepaard gaan met gebeurtenissen in het Windows-besturingssysteem en de programma's. U kunt een van de bestaande schema's selecteren of een nieuw schema maken.

Bladwijzer: Communicatie. Windows kan het volume van verschillende geluiden verlagen wanneer u uw computer gebruikt om te telefoneren.

Uitvoertoewijzing- Hier kunt u voor elk ondersteund audiokanaal de doelluidspreker in het audiosysteem van uw computer opgeven.


*Instellingen voor CoreAudio-apparaten met lage latentie ondersteunen de modi Alleen invoer, Alleen uitvoer of Full Duplex/Master Clock. U kunt eigenschappen wijzigen, zoals de hoofdklokgenerator / klokbron (MOTU, SPDIF en ADAT) en I/O-buffergrootte (lage latentie, 32 samples).
*Deze versie van Adobe Premiere Pro integreert de krachtige audio-engine van Adobe Audition om audiobewerking eenvoudiger en krachtiger te maken. Andere nieuwe functies zijn onder meer het sneller instellen van voice-overopnamen, verbeterde meerkanaals audio-export en een meer intuïtieve gebruikersinterface voor audioroutering. Een nieuwe audioroutinginterface geeft u meer controle over de visuele toewijzing van uitgangskanalen voor standaard-, mono-, adaptieve en 5.1-tracks. De workflow Clip bewerken implementeert een matrix om de beschikbare audiokanalen in het bronbestand toe te wijzen aan de kanalen en objecten in de clip te volgen. Bovendien ondersteunt Premiere Pro nu een breed scala aan plug-and-play audiohardware, waaronder ASIO en MME (Windows) en CoreAudio (Mac), en zijn er vooraf geïnstalleerde configuraties voor dit soort apparaten.