Audiogeräte. Benachrichtigung durch Senden einer Nachricht an ein Fenster oder eine Aufgabe. Benachrichtigung durch Aufruf einer Softwarefunktion

Es kommt vor, dass Ihr Telefon beim Versuch, anzurufen, eine SMS zu senden oder eine Anfrage an den Betreiber zu richten, eine Meldung anzeigt „Verbindungsproblem oder ungültiger Codemmi» . Diese Nachricht kann im ungünstigsten Moment erscheinen und große Unannehmlichkeiten verursachen, insbesondere wenn Ihr Geschäft dringend ist. In diesem Artikel erkläre ich Ihnen, was das Problem des falschen MMI-Codes ist, und teile Ihnen auch die besten Methoden zur Behebung von Verbindungsproblemen oder falschem MMI-Code mit, um sicherzustellen, dass Ihr Android-Telefon lange und zuverlässig funktioniert.

Code MMI(Mensch-Maschine-Schnittstelle – „Mensch-Maschine-Schnittstelle“) wird zur Formulierung verwendet USSD-Anfragen, wodurch die interaktive Interaktion zwischen Netzwerkteilnehmern und Betreiberdienstanwendungen organisiert werden kann. Der Benutzer nutzt MMI, um den Kontostand abzufragen, das Konto aufzuladen, einen Dienst zu verbinden oder zu trennen, zu einem anderen Tarifplan zu wechseln und so weiter.

Typischerweise beginnt der MMI-Code mit einem Sternchen und endet mit einem Hash; bei komplexen Abfragen wird auch ein Sternchen als Trennzeichen verwendet.

Verbindungsproblem oder ungültiger MMI-Code – Ursachen und Lösungen

Dieser Fehler kann bei verschiedenen Mobilfunkanbietern und auf verschiedenen Mobilgeräten auftreten und sich in Form der Meldung „Verbindungsprobleme oder ungültiger MMI-Code“, „Ungültiger MMI-Code“, „Verbindungsproblem oder ungültiger MMI“ und anderen äußern.

Oftmals tritt ein Problem mit dem MMI-Code plötzlich auf und kann ebenso plötzlich wieder verschwinden, sodass der Benutzer nicht mehr weiß, woher das Problem tatsächlich stammt. Im Folgenden werde ich eine Liste der bestehenden Ursachen des Problems auflisten und auch Möglichkeiten zur Behebung des Problems erläutern.

Instabiler Betrieb der 3G-Netze des Betreibers

Der Betrieb der heutigen 3G-Netze in Russland, der Ukraine und anderen postsowjetischen Ländern ist immer noch alles andere als ideal. Es kommt zu Ausfällen, Signalverlusten, unzuverlässigem Betrieb von Geräten und anderen Problemen, die sich auf Ihrem Gerät in Form eines Wechsels des Netzwerksymbols von 3G auf 2G und zurück äußern.

Um das Problem von Verbindungsproblemen oder falschem MMI-Code zu lösen, deaktivieren Sie einfach die 3G-Verbindung für eine Weile, damit Ihr Netzbetreiber Zeit hat, das Problem zu beheben.

Physischer Verschleiß der SIM-Karte führt zu Verbindungsproblemen oder falschem MMI-Code

Eines der häufigsten Probleme. Wenn Ihre SIM-Karte viele Jahre im Einsatz ist oder häufig entnommen und wieder eingelegt wird, kann es durch Abnutzung zu einem Funktionsverlust kommen. Versuchen Sie, es an ein anderes Telefon anzuschließen und seine Funktionalität zu überprüfen. Wenn bei einem anderen Telefon ein ähnliches Problem mit einem falschen MMI-Code auftritt, können Sie versuchen, dessen Kontakte zu löschen. Wenn das Problem weiterhin besteht, wenden Sie sich an das Büro Ihres Mobilfunkanbieters, um Ersatz zu erhalten (Experten empfehlen, die SIM-Karte alle zwei Jahre zu wechseln).

Probleme mit Geräteeinstellungen

Falsche Geräteeinstellungen oder Fehlfunktionen können ein Problem verursachen – Verbindungsprobleme oder falscher MMI-Code.

  1. Versuchen Sie, Ihr Gerät neu zu starten. Wenn das Problem weiterhin besteht, versuchen Sie es erneut vollständiger Reset Daten.
  2. Gehen Sie zu „Einstellungen“ – „Sichern und Zurücksetzen“ – „Daten zurücksetzen“ – „Gerät zurücksetzen“ (sonst „Einstellungen“ – „ Sicherung" - "Daten zurücksetzen").

Vorübergehende Probleme mit dem Mobilfunkanbieter

In diesem Fall müssen Sie nur noch warten. Sie können den Operator anrufen und herausfinden, wie lange der Fehler im MMI bestehen bleibt.

Einige Anwendungen funktionieren

Einige extern heruntergeladene Anwendungen können einen Fehler mit Verbindungsproblemen oder einem falschen MMI-Code verursachen. Um diesen Verdacht zu bestätigen oder zu widerlegen, starten Sie Ihr Gerät Sicherheitsmodus und versuchen Sie, eine Anfrage an den Betreiber zu richten. Wenn es gut läuft, bedeutet das, dass eine neue, auf dem Telefon installierte Anwendung schuld ist und entfernt werden muss.

Finden Sie auf der Website des Herstellers Ihres Gadgets heraus, wie das auf Ihrem Gerät funktioniert. Bei mir, Samsung, ist das so gemacht.

  • Zuerst müssen Sie das Gerät ausschalten, dann den Netzschalter drücken und nach dem Einschalten des Geräts die „Lautstärke verringern“-Taste einige Sekunden lang gedrückt halten (während die Entwicklerlogos angezeigt werden).
  • Nach diesen Schritten startet Ihr Smartphone (Tablet) im abgesicherten Modus (am unteren Bildschirmrand wird eine entsprechende Meldung angezeigt) und Sie können den Betrieb testen.

Abschluss

Wie wir sehen, werden Verbindungsprobleme und falscher MMI-Code in der Regel durch die Instabilität der Mobilfunknetze sowie durch physischen Verschleiß der SIM-Karte verursacht. Zu den Ursachen des Problems können falsche Telefoneinstellungen sowie Anwendungen von Drittanbietern gehören, die zu Fehlfunktionen führen können Mobilgerät. Wenn Sie einen solchen Fehler sehen, wenden Sie sich zunächst an Ihren Mobilfunkbetreiber- Es ist durchaus möglich, dass der Grund nicht bei Ihnen, sondern bei ihm liegt.

In Kontakt mit

USSD-Dienste sind seit langem etablierte Standards für die Kommunikation zwischen Teilnehmern Mobilfunknetze mit Service-Servern. Das Versenden von USSD-Nachrichten erinnert an die Kommunikation mit Bots über Telegram und andere Dienste, bei denen sie weit verbreitet sind. Durch das Senden eines Befehls erhält der Benutzer eine Antwort – dies können bestimmte Daten oder Informationen über die Ausführung des angeforderten Dienstes sein.

Viele Smartphone- und Telefonbenutzer stellen sich nicht einmal vor, was ein USSD-Interaktionsdienst ist, obwohl sie ihn regelmäßig nutzen. Kontostand prüfen, wechseln Tarifplan, Anbindung von Diensten – all das ist bei den meisten Betreibern möglich Mobile Kommunikationüber USSD-Befehle wie: *100#, *135#, *105*5# und Tausende andere.

Beim Zugriff auf den USSD-Dienst kann der Benutzer auf die folgende Fehlermeldung stoßen: „Verbindungsprobleme oder falscher MMI-Code.“ In einer solchen Situation müssen Sie versuchen, die Anfrage erneut zu senden und dabei sicherstellen, dass sie korrekt ist. Wenn die Datenanforderung oder der Befehl erneut fehlschlägt, müssen Sie die Verbindung beheben.

Unter Android kann man einen Fehler bezüglich eines falschen MMI-Codes sehen, aber es macht keinen Unterschied, welcher Mobilfunkbetreiber Verwendet: Beeline, MTS, Megafon oder andere. Eine der unten beschriebenen Methoden soll Ihnen helfen, den Fehler zu beheben.

Ungültiger MMI-Code aufgrund eines Fehlers in Android

Google perfektioniert Android aktiv, was jedoch nicht verhindert, dass verschiedene Fehler auftreten, insbesondere nachdem Smartphone-Entwickler ihre eigenen Dienste, Shells und Benutzerinstallationen eingeführt haben Anwendungen von Drittherstellern. Infolgedessen kann aufgrund von Fehlern im System ein MMI-Fehler auftreten; in einer solchen Situation ist es einfach, ihn zu beheben:

Mit diesen Aktionen können Sie die Netzwerke „neu starten“, da sie im „Flugzeugmodus“ deaktiviert sind. Wenn die Methode keine Ergebnisse liefert, können Sie auch versuchen, Ihr Smartphone neu zu starten.

MMI-Verbindungsprobleme durch Mobilfunk

Häufig tritt der Fehler „Verbindungsprobleme oder falscher MMI-Code“ aufgrund eines Problems mit der SIM-Karte oder der Mobilfunkverbindung auf. Entfernen Sie die Karte aus dem Smartphone und überprüfen Sie sie auf Beschädigungen sowie auf verschmutzte Kontakte und wischen Sie diese gegebenenfalls ab. Achten Sie auch auf das Kontaktpad am Smartphone selbst und reinigen Sie es bei Bedarf. Ersetzen Sie als Nächstes die SIM-Karte und versuchen Sie erneut, die USSD-Anfrage zu senden.

Wenn das Problem durch das Löschen der SIM-Kartenkontakte nicht behoben wurde, können Sie versuchen, den Netzwerktyp auf einen festen Netzwerktyp festzulegen. Es ist möglich, dass das Problem darauf zurückzuführen ist schlechte Verbindung und ständiger Signalverlust Mobilfunkkommunikation. In einer solchen Situation müssen Sie auf Ihrem Android-Smartphone zu Folgendem gehen:

„Einstellungen“ – „Mehr“ – „ Drahtloses Netzwerk» - « Mobilfunknetze" - "Netzwerkart"

Wählen Sie einen der verfügbaren Netzwerktypen anstelle des Standardnetzwerktyps aus. Wenn das Smartphone beispielsweise über LTE mit dem Betreiber kommuniziert, stellen Sie es auf 2G oder 3G ein.

Wichtig: Versuchen Sie, von allen Netzwerktypen aus auf den USSD-Dienst zuzugreifen.

Als letzten Ausweg können Sie versuchen, das Problem zu lösen, indem Sie die SIM-Karte austauschen, indem Sie sich an einen Mobilfunkhändler wenden.

Zusätzliche Möglichkeiten zur Behebung von MMI-Fehlern auf Android

Wenn keine der oben genannten Methoden hilft, können Sie versuchen, Ihr Smartphone wieder in den Zustand zu versetzen, in dem es sich vor dem Auftreten des Fehlers befand. Wenn in den letzten Tagen beispielsweise Änderungen an Optionen auf dem Gerät vorgenommen wurden oder Anwendungen installiert wurden, sollten Sie alle neuen Elemente entfernen und die Parameter auf ihre vorherigen Werte zurücksetzen.

Eine weitere Methode, die oft hilft, einen Fehler mit einem falschen MMI-Code zu beheben, ist das Senden einer möglicherweise fehlerhaften Anfrage. Es empfiehlt sich, statt der Anfrage „*100#“ den Befehl „*100#“ zu senden, also mit einem Komma am Ende. Um beim Wählen einer Nummer ein Komma auf der Tastatur Ihres Smartphones zu setzen, müssen Sie das Sternchen gedrückt halten.

Wenn der Fehler nicht verschwindet, nachdem Sie versucht haben, ihn mit allen oben beschriebenen Methoden zu beheben, können Sie versuchen, das Telefon auf die Werkseinstellungen zurückzusetzen oder es vollständig zurückzusetzen. Bitte beachten Sie, dass in diesem Fall einige Daten unwiederbringlich verloren gehen können.

Kompilierungsfehler in Adobe Premiere Pro sind einer der beliebtesten Fehler bei Benutzern. Es wird angezeigt, wenn Sie versuchen, das erstellte Projekt auf Ihren Computer zu exportieren. Der Vorgang kann sofort oder danach unterbrochen werden bestimmte Zeit. Lassen Sie uns herausfinden, was los ist.

Warum tritt in Adobe Premiere Pro ein Kompilierungsfehler auf?

Codec-Fehler

Sehr häufig tritt dieser Fehler aufgrund einer Nichtübereinstimmung zwischen dem Exportformat und dem auf dem System installierten Codec-Paket auf. Versuchen Sie zunächst, das Video in einem anderen Format zu speichern. Wenn nicht, deinstallieren Sie das vorherige Codec-Paket und installieren Sie ein neues. Zum Beispiel Schnelle Zeit, das sich gut mit Produkten aus der Adobe-Reihe kombinieren lässt.

Lass uns gehen „Systemsteuerung – Programme hinzufügen oder entfernen“, suchen Sie das unnötige Codec-Paket und entfernen Sie es auf die übliche Weise.

Dann gehen Sie auf die offizielle Website Schnelle Zeit, herunterladen und starten Installationsdatei. Nachdem die Installation abgeschlossen ist, starten Sie den Computer neu und starten Sie Adobe Premiere Pro.

Nicht genügend freier Speicherplatz

Dies passiert häufig beim Speichern von Videos in bestimmten Formaten. Dadurch wird die Datei sehr groß und passt einfach nicht auf die Festplatte. Stellen Sie fest, ob die Dateigröße mit dem freien Speicherplatz in der ausgewählten Partition übereinstimmt. Lass uns in meinen Computer gehen und nachschauen. Wenn nicht genügend Speicherplatz vorhanden ist, löschen wir den überschüssigen Speicherplatz von der Festplatte oder exportieren ihn in ein anderes Format.

Oder wir exportieren das Projekt an einen anderen Ort.

Diese Methode kann übrigens auch dann verwendet werden, wenn genügend Speicherplatz vorhanden ist. Manchmal hilft es bei der Lösung dieses Problems.

Speichereigenschaften ändern

Manchmal kann die Ursache dieses Fehlers ein Mangel an Speicher sein. In Adobe Premiere Pro können Sie den Wert leicht erhöhen, Sie sollten jedoch mit der Lautstärke beginnen geteilte Erinnerung und lassen Sie etwas Reserve übrig, damit andere Anwendungen funktionieren.

Lass uns gehen „Edit-Preferences-Memory-RAM verfügbar für“ und stellen Sie den gewünschten Wert für Premiere ein.

Sie sind nicht berechtigt, Dateien an diesem Speicherort zu speichern

Sie müssen sich an den Systemadministrator wenden, um die Einschränkung aufzuheben.

Der Dateiname ist nicht eindeutig

Beim Exportieren einer Datei auf einen Computer muss diese einen eindeutigen Namen haben. Andernfalls wird es nicht überschrieben, sondern es wird lediglich ein Fehler generiert, einschließlich der Kompilierung. Dies tritt häufig auf, wenn ein Benutzer dasselbe Projekt wiederholt speichert.

Schieberegler in den Abschnitten „Quelle“ und „Ausgabe“.

Beim Exportieren einer Datei gibt es auf der linken Seite spezielle Schieberegler, die die Länge des Videos anpassen. Wenn sie nicht auf ihre volle Länge eingestellt sind und beim Export ein Fehler auftritt, setzen Sie sie auf die Anfangswerte.

Lösen Sie das Problem, indem Sie die Datei in Teilen speichern

Wenn dieses Problem auftritt, speichern Benutzer die Videodatei häufig in Teilen. Zuerst müssen Sie es mit einem Werkzeug in mehrere Teile schneiden "Klinge".

Dann mit dem Tool "Auswahl" Markieren Sie die erste Passage und exportieren Sie sie. Und so mit allen Teilen. Danach werden Teile des Videos erneut geladen Adobe-Programm Premiere Pro und verbinden. Oft verschwindet das Problem.

Unbekannte Fehler

Wenn alles andere fehlschlägt, müssen Sie sich an den Support wenden. Denn in Adobe Premiere Pro treten häufig Fehler auf, deren Ursache mit einer Reihe von Unbekannten zusammenhängt. Löse sie für den durchschnittlichen Benutzer nicht immer möglich.

Auf Wunsch des Programms kann das Sound-Subsystem drei Benachrichtigungsoptionen verwenden: Setzen eines Programmereignisobjekts (Ereignis), Aufrufen einer bestimmten Programmfunktion (Rückruf) oder Senden einer Nachricht an ein bestimmtes Fenster oder eine bestimmte Aufgabe (Thread). In der ersten Version erhält das Programm nur Informationen über die Tatsache eines Ereignisses im Sound-Subsystem und muss selbst herausfinden, was genau passiert ist; Bei der zweiten und dritten Möglichkeit werden der Ereigniscode und klärende Informationen übermittelt.

Das Sound-Subsystem übermittelt Benachrichtigungen an das Programm über drei Arten von Ereignissen: erfolgreiches Öffnen des Geräts, erfolgreiches Schließen des Geräts und Abschluss der Verarbeitung des nächsten Puffers aus der Treiberwarteschlange. Streng genommen ist nur das letzte Ereignis vollständig asynchron; Die ersten beiden treten unmittelbar nach dem erfolgreichen Öffnen und Schließen des Geräts auf und werden bereits vor der Rückkehr von den entsprechenden Schnittstellenfunktionen an das Programm übergeben.

Benachrichtigung durch Senden einer Nachricht an ein Fenster oder eine Aufgabe

Das Sound-Subsystem sendet eine Windows-Nachricht an ein bestimmtes Fenster oder eine bestimmte Aufgabe, deren Code das aufgetretene Ereignis widerspiegelt, und übergibt in den Nachrichtenparametern den Schlüssel des geöffneten Soundgeräts und Weitere Informationenüber die Veranstaltung. Die Nachricht wird asynchron über Funktionen versendet POST-Meldung oder PostThreadMessage und wird zusammen mit anderen Windows-Meldungen aus dem Fenster oder der Aufgabenwarteschlange ausgewählt.

Die Namen der Konstanten für Nachrichtencodes haben die Form MM_WxM_event, Wo X- Gerätetyp (Buchstabe ICH- für ein Eingabegerät bzw Ö- für das Ausgabegerät) und Ereignis- Veranstaltungstyp:

Mitteilungen MM_BxM_OPEN Und MM_BxM_CLOSE werden an Geräte beider Typen gesendet und MM_WIM_DATA Und MM_WOM_DONE- nur an Eingabe- bzw. Ausgabegeräte.

In allen Nachrichten der Parameter wParamübermittelt den Schlüssel des Geräts, das das Ereignis generiert hat. In Nachrichten DATEN/ERLEDIGT Parameter lParamübergibt einen Header-Zeiger an den zurückgegebenen Audiopuffer.

Nachrichten vom Audio-Subsystem erfordern keinen Rückgabewert von der Funktion, die sie verarbeitet.

Benachrichtigung durch Aufruf einer Softwarefunktion

Das Sound-Subsystem ruft eine bestimmte Softwarefunktion auf und übergibt dabei Ereigniscode und Parameter als Argumente. Der Prototyp der aufgerufenen Funktion hat die folgende Form:

void CALLBACK CallbackProc(HWAVEx Handle, UINT Msg, DWORD Instance, DWORD Param1, DWORD Param2);

Handhaben- Audiogeräteschlüssel. Hat einen Typ HWAVEIN oder HWAVEOUT; Es ist zulässig, einen generischen Typ zu verwenden HWAVE.

Nachricht- Ereigniscode. Konstanten für Ereigniscodes haben die gleichen Namen wie Konstanten für Meldungscodes für Fenster/Aufgaben, jedoch ohne Präfix MM_ (WIM_OPEN, WOM_FERTIG usw.). Tatsächlich sind sie jetzt in definiert MMSYSTEM.H als Äquivalent zu Konstanten mit Präfix MM_ Allerdings sollten Sie in Zukunft nicht damit rechnen.

Beispiel- 32-Bit-Informationswort, das vom Programm beim Öffnen des Geräts angegeben wird. Das Audio-Subsystem verwendet diesen Wert in keiner Weise, sondern übergibt ihn nur bei jedem Funktionsaufruf.

Param1, Param2- Ereignisparameter. Für Veranstaltungen OFFEN Und SCHLIESSEN Bedeutung Param1 gleich Null; für Veranstaltungen DATEN Und ERLEDIGT Dieser Parameter übergibt den Header-Zeiger an den zurückgegebenen Audiopuffer. Bedeutung Param2 In der aktuellen Implementierung ist es immer Null.

Die Funktion kann im Kontext eines Interrupt-Handlers aufgerufen werden, sodass nur eine begrenzte Anzahl von Interrupt-Handlern sicher verwendet werden kann Windows-Funktionen: Geben Sie CriticalSection ein, LeaveCriticalSection, midiOutLongMsg, midiOutShortMsg, OutputDebugString, POST-Meldung, PostThreadMessage, SetEvent, timeGetSystemTime, timeGetTime, timeKillEvent, timeSetEvent. Auf andere zugehen Systemfunktionen sowie die Funktionen des Sound-Subsystems können unvorhersehbare Folgen haben.

Um eine Funktion aufzurufen, erstellt das Sound-Subsystem eine separate Aufgabe (Thread) mit einer höheren (ABOVE_NORMAL) Priorität. Im Gegensatz zur Nachrichtenübermittlung, die der Reihe nach verarbeitet wird, erfolgt der Aufruf einer Funktion parallel zur Arbeit anderer Aufgaben im Prozess. Daher muss darauf geachtet werden, den Zugriff der Funktion und anderer Aufgaben auf gemeinsam genutzte Variablen und Datenstrukturen zu synchronisieren.

Eine Hilfsaufgabe wird einmal erstellt und bleibt bestehen, bis der Prozess abgeschlossen ist. Das Audio-Subsystem ruft von dieser Aufgabe aus Benachrichtigungsfunktionen für alle Geräte auf, die während der Lebensdauer des Prozesses geöffnet sein werden.

Eine Reihe von Schnittstellenfunktionen für Audiogeräte

Im Folgenden halten wir uns an ein universelles System zur Benennung von Funktionen, wobei wir nur den semantischen Teil des Namens angeben und das Präfix weglassen, das den Typ und die „Ausrichtung“ des Geräts enthält. Wenn wir beispielsweise über die GetDevCaps-Funktion sprechen, meinen wir zwei Funktionen: waveInGetDevCaps Und waveOutGetDevCaps, wobei nur die Unterschiede zwischen Eingabe- und Ausgabegeräten erläutert werden. Dies erfordert, dass der Leser in jedem Einzelfall den vollständigen Namen der Funktion „konstruiert“, ermöglicht aber eine umfassendere und systematischere Beschreibung. Im Funktionsprototyp wird das Präfix durch die Sequenz „ xxx».

Der erste Parameter der meisten Funktionen gibt die Taste (Handle) des offenen Soundgeräts an, das den Typ hat HWAVEIN oder HWAVEOUT; Im Prototyp ist der Typ angegeben HWAVEx. Wie bereits erwähnt, können Audiogeräteschlüssel in Variablen eines kompatiblen Typs gespeichert werden HWAVE.

Liste der Schnittstellenfunktionen

Anzahl Geräte anfordern

Fordern Sie Geräteparameter und -funktionen an

Öffnen des Geräts

Schließen des Geräts

Vorbereiten (Fixieren im Speicher) des Soundpuffers

Freigeben (Entsperren) des Audiopuffers

AddBuffer/Write

Übergabe des nächsten Puffers an den Gerätetreiber

Stoppen Sie die Aufnahme/Wiedergabe

Starten Sie die Aufnahme/Wiedergabe

Thread zurücksetzen

SetVolume/GetVolume

Wiedergabelautstärke einstellen/abfragen

SetPitch/GetPitch

Tonhöhe während der Wiedergabe einstellen/abfragen

SetPlaybackRate / GetPlaybackRate

Wiedergabegeschwindigkeit einstellen/abfragen

Anfordern einer Gerätenummer per Schlüssel

Fehlermeldungstext per Code anfordern

Senden einer nicht standardmäßigen Nachricht an den Fahrer

Von Schnittstellenfunktionen zurückgegebene Werte

Mit wenigen Ausnahmen geben alle Audio-Interface-Funktionen ein Ergebnis vom Typ zurück MMRESULT, entspricht Typ UINT. Bedeutung MMSYSERR_NOERROR, in der aktuellen Implementierung gleich Null, bedeutet erfolgreiche Ausführung der Funktion; jeder andere Wert weist auf einen Fehler hin. Konstanten für Fehlercodes haben Präfixe MMSYSERR_(allgemeiner Fehler im Multimedia-Subsystem) und WAVERR_(Wave-Gerätetreiberfehler):

MMSYSERR_BADDEVICEID

Ungültige Gerätenummer

MMSYSERR_NOTENABLED

Treiber nicht aktiviert

MMSYSERR_ALLOCATED

Das Gerät ist mit einer anderen Anwendung beschäftigt

MMSYSERR_INVALHANDLE

Ungültiger offener Geräteschlüssel

MMSYSERR_NODRIVER

Treiber fehlt

Nicht genug Speicher

MMSYSERR_NOTSUPPORTED

Die angeforderte Funktion wird nicht unterstützt

MMSYSERR_BADERRNUM

Fehlercode außerhalb des gültigen Bereichs

MMSYSERR_INVALFLAG

Ungültige Flagge

MMSYSERR_INVALPARAM

Ungültiger Parameter

MMSYSERR_HANDLEBUSY

Eine Operation wird auf dem Schlüssel von einer anderen Aufgabe ausgeführt

Unspezifizierter Fehler

MMSYSERR_NODRIVERCB

Der Fahrer hat Benachrichtigungen nicht erfüllt (Rückruf)

WAVERR_BADFORMAT

Ungültiges oder nicht unterstütztes Stream-Format

WAVERR_STILLPLAYING

Aufnahme oder Wiedergabe läuft

WAVERR_UNPREPARED

Puffer nicht vorbereitet

Das Gerät arbeitet nur im Synchronmodus

GetDevCaps – Geräteparameter und -funktionen anfordern

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

Wird verwendet, um die Parameter und Fähigkeiten des Geräts zu bestimmen.

DevId- Gerätenummer beginnend bei Null oder der Schlüssel eines zuvor geöffneten Geräts oder eine Konstante WAVE_MAPPER. Im letzteren Fall werden die Parameter des Standardsystemgeräts zurückgegeben.

Kappen- Zeiger auf eine Struktur vom Typ WAVEINCAPS oder WAVEOUTCAPS (es gibt spezielle Typen). LPWAVEINCAPS Und LPWAVEOUTCAPS).

CapsSize- Größe der Struktur in Bytes.

Nach erfolgreichem Abschluss füllt die Funktion die Felder der vom Zeiger übergebenen Struktur mit Geräteparametern. Wenn Parameter angefordert wurden Welle Mapper, dann wird der Name des Umleitungsdienstes als Gerätename zurückgegeben.

Öffnen – Öffnen des Geräts

MMRESULT xxxOpen (LPHWAVEx ForHandle, UINT DevId, LPCWAVEFORMATEX Format, DWORD Callback, DWORD Instance, DWORD OpenFlags);

ForHandle- Variablenzeiger eingeben HWAVEIN oder HWAVEOUT(Zeigertyp - LPHWAVEIN oder LPHWAVEOUT), in das nach erfolgreichem Abschluss des Vorgangs der Schlüssel des geöffneten Geräts geschrieben wird.

DevId- Gerätenummer beginnend bei Null, oder der Schlüssel eines zuvor geöffneten Geräts, oder der Wert WAVE_MAPPER. Im letzteren Fall wählt der Umleitungsdienst ein Gerät aus, das das angegebene Format unterstützt, und die Suche beginnt mit dem Standardsystemgerät.

Format– Zeiger auf eine Struktur vom Typ WAVEFORMATEX, die das erforderliche Stream-Format beschreibt.

Ruf zurück- ein Objekt, an das Fahrerbenachrichtigungen über die Ausführung angeforderter Vorgänge gesendet werden. Wird durch den Fenster- oder Ereignisschlüssel (Handle), Funktionszeiger oder Aufgabenbezeichner (Thread-ID) angegeben.

Beispiel- 32-Bit-Informationswort, das vom Treiber in den Parametern des Bübertragen wird. Wenn Sie beispielsweise eine generische Schnittstelle mit Audiogeräten entwickeln, könnte dies ein Zeiger auf ein Gerätehandle (Struktur oder Klassenobjekt) sein.

OpenFlags- Flaggen der Öffnungs- und Betriebsmodi des Geräts:

Der Treiber benachrichtigt das Programm nicht, wenn Vorgänge ausgeführt werden. Dieser Modus ist die Standardeinstellung

Parameter Ruf zurück ist der Schlüssel des Ereignisobjekts (Ereignishandle)

Parameter Ruf zurück ist die Thread-ID

Parameter Ruf zurück ist der Fensterschlüssel

CALLBACK_FUNCTION

Parameter Ruf zurück ist ein Funktionszeiger

WAVE_FORMAT_QUERY

Formatabfragemodus. Der Treiber prüft lediglich, ob das angegebene Gerät mit den angeforderten Formaten und Modi geöffnet werden kann und gibt den entsprechenden Ergebniscode zurück. In diesem Modus ist der Parameter ForHandle kann null sein ( NULL)

WAVE_FORMAT_DIRECT

Verhindert, dass Wave Mapper und ACM an der Konvertierung des Stream-Formats teilnehmen. Der gesamte Datenaustausch erfolgt nur zwischen dem Treiber und der Anwendung

Ermöglicht das Öffnen des Geräts im synchronen Modus. Für vollständig synchrone Geräte muss dieses Flag angegeben werden

Ermöglicht Wave Mapper und ACM, den Austausch von Audiodaten zwischen dem Programm und dem Gerätetreiber zu stören

Wenn das Gerät erfolgreich geöffnet wurde (wenn das Format-Polling-Flag nicht gesetzt war), kehrt das Sound-Subsystem zu der Variablen zurück, auf die der Zeiger verweist ForHandle, der Schlüssel (Griff) eines geöffneten Geräts.

Eingabegeräte öffnen sich im Stoppmodus und die Weitergabe von Schallpuffern an den Fahrer führt nicht dazu automatischer Start Datensätze - dazu müssen Sie die Startfunktion aufrufen. Ausgabegeräte öffnen sich sofort im Wiedergabemodus und wenn der erste Audiopuffer an den Treiber übertragen wird, beginnt dessen Wiedergabe automatisch.

Wenn Sie mit der Arbeit an einem Gerät fertig sind, müssen Sie es mit der Schließen-Funktion schließen, da sonst das geöffnete Gerät einfrieren kann. Im Gegensatz zum Dateisystem reagiert das Sound-Subsystem in Windows viel empfindlicher auf Fehler und ist nicht immer in der Lage, die Programmbeendigung zu verfolgen, um Soundgeräte zum Absturz zu bringen.

PrepareHeader – Vorbereiten des Puffers und seines Headers für die Übertragung an den Treiber

MMRESULT xxxPrepareHeader(HWAVEx Handle, LPWAVEHDR Hdr, UINT HSize);

HDR

HGröße

Bereitet den Audiopuffer für die Übertragung an den Treiber vor. Typischerweise besteht die Vorbereitung darin, den Puffer im Speicher festzuschreiben, damit er während einer Off-Process-Übertragung (DMA) nicht auf die Festplatte entfernt (herausgepumpt) wird. Das Audio-Subsystem setzt das Flag im Header des vorbereiteten Puffers WHDR_PREPARED.

Vor dem Aufruf der Funktion müssen die Felder im Pufferheader ausgefüllt werden lpData, dwBufferLength, dwFlags.

Bei einem bereits vorbereiteten Puffer führt die Funktion keine Aktion aus und wird erfolgreich abgeschlossen.

Write/AddBuffer – Übertragen des Audiopuffers an den Treiber

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

HDR- Audio-Puffer-Header-Anzeige.

HGröße- Größe der Header-Struktur.

Übergibt den Audiopuffer zur Wiedergabe an den Treiber ( Schreiben) oder zum Schreiben ( AddBuffer). Der Puffer muss mit der Prepare-Funktion vorbereitet werden, sonst verweigert der Fahrer die Annahme.

Nach Erhalt des Puffers setzt der Treiber das WHDR_DONE-Flag in seinem Header zurück, fügt den Header in die interne Warteschlange ein und setzt das WHDR_INQUEUE-Flag. Danach gibt der asynchrone Treiber die Kontrolle an die Anwendung zurück und setzt die parallele Verarbeitung der Pufferwarteschlange basierend auf Geräteinterrupts fort; Der synchrone Treiber gibt die Kontrolle erst zurück, nachdem die Verarbeitung des Puffers abgeschlossen ist.

Nachdem die Verarbeitung des nächsten Puffers abgeschlossen ist, entfernt der Treiber ihn aus der Warteschlange, setzt das Flag WHDR_INQUEUE zurück, setzt dann das Flag WHDR_DONE und benachrichtigt dann die Anwendung, wenn dies beim Öffnen des Geräts angefordert wurde. Der Treiber verarbeitet dann den nächsten Puffer in der Warteschlange weiter.

Die Anwendung darf keine Headerfelder ändern, bis der Treiber die Verarbeitung des Puffers abgeschlossen hat.

Da der Pufferheader nur ein Feld zum Einbinden in eine Liste enthält, führt die erneute Übermittlung eines bereits in der Warteschlange befindlichen Puffers an den Treiber zu einem Fehler.

Start/Neustart – Aufnahme/Wiedergabe starten

MMRESULT waveInStart(HWAVEx Handle); MMRESULT waveOutRestart(HWAVEx Handle); Startet die Aufnahme/Wiedergabe ab der aktuellen Stream-Position.

Wenn der Thread aktiv ist, führt die Funktion keine Aktion aus und wird erfolgreich abgeschlossen.

BreakLoop – unterbricht die aktuelle Schleife

MMRESULT waveOutBreakLoop(HWAVEx Handle);

Setzt den Wiedergabeschleifenmodus zurück, falls festgelegt. Der aktuelle Loop-Durchlauf wird bis zum Ende abgespielt, dann wird die Wiedergabe linear fortgesetzt, ohne zum ersten Loop-Puffer zurückzukehren. Eine Gruppe von Schleifenpuffern wird an das Programm zurückgegeben, sobald die Wiedergabe abgeschlossen ist.

Wenn der Thread gestoppt wird oder keine Schleife vorhanden ist, führt die Funktion keine Aktion aus und wird erfolgreich abgeschlossen.

SetVolume – Wiedergabelautstärke einstellen

MMRESULT waveOutSetVolume(HWAVEx Handle, DWORD Volume);

Volumen- Lautstärke auf dem linken und rechten Kanal. Das Low-Wort stellt die Lautstärke des linken Kanals ein, das High-Wort stellt die Lautstärke des rechten Kanals ein. Der Wert 0xFFFF legt die maximale Lautstärke fest, 0 - die minimale. Bei Adaptern, die keine unabhängige Lautstärkeregelung nach Kanal unterstützen, legt das Low-Wort die Lautstärke in beiden Kanälen des Pfads fest.

Die Funktion stellt den Ausgangspegel des wiedergegebenen Signals ein. Obwohl die Funktion 65.536 Lautstärkestufen ermöglicht, unterstützen die meisten Adapter nur zwischen 8 und 256 Stufen. In solchen Fällen sind nur die drei bis acht höchstwertigen Ziffern des Lautstärkewerts von Bedeutung; die niedrigstwertigen Ziffern werden ignoriert. Diese Interpretation ermöglicht es Ihnen, dieselbe Lautstärkeskala zu verwenden und nur den Grad der Stufenanpassung zu ändern.

Die Funktion wird nur von Adaptern unterstützt, deren Eigenschaften das Flag WAVECAPS_VOLUME gesetzt haben. Eine separate Anpassung nach Kanälen wird nur unterstützt, wenn das Flag WAVECAPC_LRVOLUME vorhanden ist.

SetPitch / SetPlaybackRate – Einstellen der Tonhöhe / Wiedergabegeschwindigkeit

MMRESULT waveOutSetPitch(HWAVEx Handle, DWORD Multiplier); MMRESULT waveOutSetPlaybackRate(HWAVEx Handle, DWORD Multiplier); Multiplikator- Multiplikator für Tonhöhe/Wiedergabegeschwindigkeit. Das High-Wort gibt den ganzzahligen Teil des Multiplikators an, das Low-Word gibt den Bruchteil an. Wenn es einen Multiplikatorwert gibt F Typ doppelt, und konvertieren Sie es dann in einen Typ DWORD geht mit der Formel:

Multiplikator = (DWORD)(f * 0x10000)

Die Funktionen ändern die Tonhöhe oder Wiedergabegeschwindigkeit des Streams, ohne die Samplerate zu ändern, mit der der Stream abgespielt wird. Der Multiplikatorwert muss positiv sein. Der Standardmultiplikator ist 1,0, was bedeutet, dass der Stream in seiner natürlichen Höhe und Geschwindigkeit abgespielt wird.

Wenn Sie die Tonhöhe ändern, werden alle Töne im Stream höher oder tiefer, aber die Dauer jedes Tons und die Gesamtspielzeit bleiben erhalten. Das Ändern der Wiedergabegeschwindigkeit ähnelt dem Ändern der Geschwindigkeit einer Kassette in einem Tonbandgerät: Alle Töne werden höher oder leiser und die Gesamtwiedergabezeit verringert oder erhöht sich entsprechend.

Nicht alle Soundadapter unterstützen dieses Funktionspaar; Die Implementierung erfolgt in der Regel auf spezialisierten Signalprozessoren (DSP). Technisch gesehen besteht die einfachste Möglichkeit, eine Geschwindigkeitsänderung zu implementieren, darin, die Zwischenabtastwerte, die häufiger oder seltener aufeinander folgen, an den Punkten zwischen vorhandenen Abtastwerten zu interpolieren und an die DAC-Schaltung zu senden. Die Änderung der Tonhöhe erfordert viel komplexere Berechnungen: Fragmente des Stroms werden in eine Fourier-Reihe zerlegt und bilden ein Klangspektrum, dann wird das Spektrum in Richtung hoher oder niedriger Frequenzen verschoben, woraufhin wieder ein Fragment eines neuen Klangstroms gebildet wird das veränderte Spektrum.

Für Adapter, die Tonhöhen- und/oder Geschwindigkeitsänderungen unterstützen, setzt die GetDevCaps-Funktion die Flags WAVECAPS_PITCH und WAVECAPS_PLAYBACKRATE.

GetID - Gerätenummer per Schlüssel anfordern

MMRESULT xxxGetID (HWAVEx-Handle, LPUINT ForID);

ForID- Variablenzeiger eingeben UINT, in dem die Gerätenummer eingetragen ist.

Die Funktion ermittelt die Nummer des Geräts, beim Öffnen gibt das System den angegebenen Schlüssel zurück. Wenn beim Öffnen der Umleitungsdienst verwendet wurde (Wert WAVE_MAPPER anstelle einer Zahl oder des WAVE_MAPPED-Flags) gibt die Funktion den Wert zurück WAVE_MAPPER.

In der Dokumentation von Microsoft wird behauptet, dass diese Funktion nur aus Kompatibilitätsgründen unterstützt wird und dass alles, was Sie tun müssen, um die Nummer zu erhalten, darin besteht, den Schlüssel in den richtigen Typ umzuwandeln, aber das ist überhaupt nicht der Fall. Der offene Geräteschlüssel ist die Adresse eines Deskriptors, der zum Audio-Subsystem gehört, und befindet sich in Win32 in einem gemeinsam genutzten Speicherbereich. Die einzige Möglichkeit, die Gerätenummer per Schlüssel zu erhalten, ist die Verwendung der Funktion GetID.

GetErrorText – Fordern Sie eine Textfehlermeldung per Code an

MMRESULT xxxGetErrorText(MMRESULT Error, LPSTR Text, UINT TextSize);

Fehler- Fehlercode, der von einer der Schnittstellenfunktionen zurückgegeben wurde;

Text- Zeiger auf einen Textpuffer (Array vom Typ verkohlen);

Textgröße- Größe des Textpuffers in Bytes.

Die Funktion schreibt eine Textbeschreibung des Fehlers mit dem angegebenen Code in den angegebenen Puffer. Der geschriebene Text wird mit einem Nullbyte abgeschlossen. Ist der Puffer nicht groß genug, wird das Textende abgeschnitten; das Nullbyte wird in jedem Fall in den Puffer geschrieben. Die Größe des Puffers, der jede Fehlermeldung aufnehmen kann, wird durch die Konstante bestimmt MAXIMALE FEHLERLÄNGE.

Fehlermeldungen sind nicht nach Gerätetyp unterteilt. Um den Text eines Fehlers anzufordern, reicht eine der folgenden Angaben aus. mögliche Funktionen, Zum Beispiel waveOutGetErrorText.

Nachricht – Senden Sie eine Nachricht an den Fahrer

MMRESULT xxxMessage (HWAVEx-Handle, UINT-Msg, DWORD P1, DWORD P2);

Nachricht- Code der übermittelten Nachricht.

P1, P2- Nachrichtenparameter.

Die Funktion dient dazu, direkt eine Nachricht an den Fahrer zu senden. Alle Schnittstellenfunktionen außer GetID und GetErrorText werden vom Audio-Subsystem in an den Treiber gesendete Nachrichten übersetzt; Jede Nachricht hat zwei Parameter vom Typ DWORD, in die die Parameter von Schnittstellenfunktionen umgewandelt werden. Wenn der Gerätetreiber nicht standardmäßige Nachrichten unterstützt, können diese über die Funktionen an ihn gesendet werden Nachricht. Der Rückgabewert wird vom Treiber selbst bestimmt.

Nachteile des MME-Audio-Subsystems

In Windows 95/98 blieben das MME-Subsystem und seine Treiber wie in Windows 3.x 16-Bit. Aus diesem Grund geht jeder Aufruf des Soundtreibers aus einer Win32-Anwendung mit einem doppelten Wechsel des Ausführungsmodus (Thunking) einher, was leider zu zusätzlichem Overhead führt, der auf Celeron-366-Prozessoren bis zu einigen Millisekunden betragen kann. Darüber hinaus begrenzen viele Treiber die Aktualisierungsrate des Ringpuffers, über den der Austausch zwischen Computer und Adapter erfolgt, auf mehrere zehn Mal pro Sekunde, was zu einer Verzögerung (Latenz) bei der Audioübertragung führt. Bei Treibern für ISA-Adapter kann diese Verzögerung mehrere zehn Millisekunden erreichen; bei Treibern für PCI-Adapter ist sie normalerweise auf einige Millisekunden begrenzt.

Für eine schnellere Tonausgabe, insbesondere bei Echtzeitmodifikationen, hat Microsoft weitere entwickelt neue Schnittstelle - DirectSound. Diese Schnittstelle soll „die Adapter-Hardware näher an das Anwendungsprogramm bringen und es ihr ermöglichen, Ton fast direkt im Ringpuffer des Systems aufzuzeichnen, wodurch die maximale Verzögerung bei jedem Adapter auf wenige Millisekunden reduziert wird.“ Bei der Arbeit mit DirectSound Das Programm greift direkt auf den 32-Bit-Systemadaptertreiber (VxD) zu, ohne zwischen dem 32- und 16-Bit-Ausführungsmodus wechseln zu müssen.

Um zu effiziente Arbeit Schnittstelle DirectSound muss vom Systemadaptertreiber unterstützt werden. Für Geräte, deren Treiber dies nicht unterstützen DirectSound Windows emuliert die neue Schnittstelle „zusätzlich“ zum regulären MME-Treiber, allerdings erhöhen sich in diesem Fall alle Verzögerungen aufgrund des Emulationsaufwands sogar noch.

Leider hat Microsoft die Erweiterungsspezifikation entwickelt DirectSound für Audio-VxD nur im Hinblick auf die Audiowiedergabe und handelt in erster Linie im Interesse der Spielehersteller. Ton aufnehmen über DirectSound erfolgt weiterhin durch Emulation auf MME.

Es muss gesagt werden, dass das Sound-Subsystem von Windows 3.x und 95/98 sowie das Subsystem Fernzugriff an das Netzwerk (RAS) weist eine geringe Fehlertoleranz auf. Dies äußert sich am häufigsten darin, dass beim Absturz eines Programms, das Audiogeräte öffnet und mit ihnen arbeitet, das System die verwendeten Geräte nicht ordnungsgemäß schließt (bereinigt). Daher kann nach einem solchen Absturz in manchen Fällen ein Neustart erforderlich sein und bis dahin sind entsperrte Geräte für andere Anwendungen nicht zugänglich. Darüber hinaus sind 16-Bit-Subsysteme deutlich weniger fehlersicher als 32-Bit-Subsysteme, sodass schwerwiegende Fehler in Soundprogrammen zu Abstürzen und Einfrieren des gesamten Windows-Systems führen können.

In Windows NT sind alle Subsysteme zunächst auf 32-Bit ausgelegt, sodass die beschriebenen Probleme dort nicht auftreten. Allerdings werden Verzögerungen bei der Audio-Ein- und -Ausgabe immer noch durch die Aktualisierungsrate des Ringpuffers bestimmt, die vom Treiber eines bestimmten festgelegt wird Adapter.

Ein Beispielprogramm, das die MME-Schnittstelle verwendet

Zur Veranschaulichung wird ein Programm gegeben, das den Verzögerungseffekt in Echtzeit umsetzt. Der Kern des Effekts besteht in der Hinzufügung des ursprünglichen Tonsignals zu seiner Kopie, zeitlich geringfügig verzögert (einige bis Hunderte von Millisekunden). Eine Verzögerung von bis zu 15-20 ms wird vom Gehör als „Zerquetschen“ der Schallquelle wahrgenommen; Die Erzeugung einer Chorwirkung basiert auf diesem Prinzip. Eine Verzögerung von 20–50 ms wird als Nachhall (Lautstärkegefühl) wahrgenommen, größere Verzögerungen werden als regelmäßiges Echo wahrgenommen.

Um aus den beschriebenen Effekten einen glaubwürdigen Klang zu erzielen, ist es üblich, mehrere aufeinanderfolgende Audioverzögerungen vorzunehmen, bei denen eine Kopie des Originalsignals schrittweise gedämpft wird. Im obigen Programm wird der Einfachheit halber nur eine Verzögerung vorgenommen und die Kopie des Signals wird nicht gedämpft.

Das Programm ist in C++ implementiert. Tatsächlich wurden darin nur gängige Erweiterungen von C++ verwendet (Definition von Variablen in Schleifenheadern, Verwendung von Strukturnamen als Typnamen usw.), ansonsten können wir davon ausgehen, dass die reguläre ANSI-C-Sprache verwendet wurde.

Das Programm wurde in der MS VC++ 4.2-Umgebung entwickelt. Nur standardmäßig verwendet Windows-Schnittstelle, ohne Erweiterungen aus der Entwicklungsumgebung.

Das Programm arbeitet in Echtzeit und öffnet gleichzeitig zwei Audiogeräte – Eingabe und Ausgabe. Gefüllte Audiopuffer, die vom Eingabegerät eintreffen, werden mit ihren zeitversetzten Kopien zusammengefasst und dann an das Ausgabegerät gesendet. Ein gemeinsamer Satz von Audiopuffern zirkuliert zwischen den Eingabe- und Ausgabegeräten.

Um die Zirkulation der Puffer zu verwalten, ist ein separater Arbeitsaufgabe(Worker-Thread), dem die maximale Prioritätserhöhung zugewiesen wird. Audiogeräte werden im Benachrichtigungsmodus für Arbeitsaufgaben geöffnet.

Aufgrund der Pufferung liegt die Tonausgabe des Programms etwas hinter dem Originalton zurück. Die Gesamtpufferzeit und die Anzahl der Soundpuffer werden im Abschnitt Programmparameter eingestellt. Für eine kontinuierliche Audioübertragung sollte die Anzahl der Puffer nicht weniger als zwei betragen; Selbst bei Verwendung von drei oder vier Puffern wird eine akzeptable Stabilität erreicht.

Damit das Programm funktioniert, benötigen Sie einen Vollduplex-Audioadapter, der dies ermöglicht gleichzeitiges Arbeiten Ihr ADC und DAC. Die meisten modernen Adapter erfüllen diese Bedingung.

Beispiel

ComputerPress 6"2000