Աուդիո սարքավորումներ. Ծանուցում պատուհանին կամ առաջադրանքին հաղորդագրություն ուղարկելով: Ծրագրի գործառույթի զանգի ծանուցում

Պատահում է, որ երբ փորձում եք զանգահարել, SMS ուղարկել կամ հարցում կատարել օպերատորին, ձեր հեռախոսը ցուցադրում է հաղորդագրություն «Միացման խնդիր կամ անվավեր կոդmmi» . Այս հաղորդագրությունըկարող է հայտնվել ամենաանպատեհ պահին և շատ անհարմարություններ առաջացնել, հատկապես, երբ ձեր գործը հրատապ է։ Այս հոդվածում ես կբացատրեմ, թե որն է սխալ mmi կոդի խնդիրը, ինչպես նաև կկիսվեմ լավագույն մեթոդներով, թե ինչպես շտկել կապի խնդիրները կամ սխալ MMI կոդը՝ դարձնելով ձեր Android հեռախոսը երկար և հուսալի աշխատել:

Կոդ MMI(Man-Machine Interface - «Man-Machine Interface») օգտագործվում է ձևակերպելու համար. USSD հարցումներ, որը թույլ է տալիս կազմակերպել ինտերակտիվ փոխազդեցություն ցանցի բաժանորդների և օպերատորի սպասարկման հավելվածների միջև: Օգտատերն օգտագործում է MMI մնացորդը պարզելու, հաշիվը համալրելու, որևէ ծառայություն միացնելու կամ անջատելու, այլ սակագնային պլանի անցնելու և այլնի համար:

Սովորաբար MMI կոդը սկսվում է աստղանիշով և ավարտվում ֆունտի նշանով, բարդ հարցումների դեպքում աստղանիշն օգտագործվում է նաև որպես բաժանարար։

Միացման խնդիր կամ անվավեր mmi կոդը - պատճառներ և լուծումներ

Այս սխալը կարող է առաջանալ տարբեր բջջային օպերատորների և տարբեր բջջային սարքերի հետ՝ դրսևորվելով «Միացման խնդիրներ կամ անվավեր MMI կոդ», «Անվավեր MMI կոդ», «Միացման խնդիր կամ անվավեր MMI» և այլ հաղորդագրության տեսքով:

Հաճախ mmi կոդի հետ կապված խնդիրը հանկարծակի է ի հայտ գալիս և կարող է նույնքան հանկարծակի անհետանալ՝ օգտատերին թողնելով դրա արտաքին տեսքի իրական աղբյուրների կորուստը: Ստորև ես կթվարկեմ խնդրի առկա պատճառները, ինչպես նաև կխոսեմ խնդրի շտկման մասին:

Օպերատորի 3G ցանցերի անկայուն շահագործում

Այսօրվա 3G ցանցերի աշխատանքը Ռուսաստանում, Ուկրաինայում և հետխորհրդային այլ երկրներում դեռ հեռու է իդեալական լինելուց։ Կան ձախողումներ, ազդանշանի կորուստ, սարքավորումների անվստահելի շահագործում և այլ անախորժություններ, որոնք դրսևորվում են ձեր սարքում ցանցի պատկերակը 3G-ից 2G և հետ փոխելու տեսքով:

Միացման խնդիրների կամ սխալ MMI կոդի խնդիրը լուծելու համար բավական է ժամանակավորապես անջատել 3G կապը՝ ձեր օպերատորին ժամանակ տալով խնդիրները շտկելու համար:

SIM քարտի ֆիզիկական վատթարացումը առաջացնում է կապի խնդիրներ կամ սխալ MMI կոդը

Ամենատարածված խնդիրներից մեկը. Եթե ​​SIM քարտը երկար տարիներ աշխատում է ձեզ մոտ, կամ հաճախ հանվում և տեղադրվում է, ապա այն կարող է կորցնել իր աշխատանքը մաշվածության պատճառով: Փորձեք միացնել այն մեկ այլ հեռախոսի և տեսեք, արդյոք այն աշխատում է: Եթե ​​մեկ այլ հեռախոսի մոտ նման խնդիր կա սխալ MMI կոդի հետ, ապա կարող եք փորձել ջնջել դրա կոնտակտները, իսկ եթե խնդիրը շարունակվի, դիմեք ձեր բջջային օպերատորի գրասենյակ փոխարինելու համար (մասնագետները խորհուրդ են տալիս փոխել SIM քարտը 2 տարին մեկ անգամ):

Սարքի կարգավորումների հետ կապված խնդիրներ

Սարքի սխալ կարգավորումները, ինչպես նաև դրա աշխատանքի մեջ անսարքությունները կարող են խնդիր առաջացնել՝ կապի խնդիրներ կամ սխալ MMI կոդը:

  1. Փորձեք վերագործարկել ձեր սարքը, և եթե խնդիրը չվերանա, փորձեք գործարկել ամբողջական վերականգնումտվյալները։
  2. Գնացեք «Կարգավորումներ» - «Պահուստավորում և վերակայում» - «Տվյալների վերականգնում» - «Վերականգնել սարքը» (հակառակ դեպքում «Կարգավորումներ» - « Կրկնօրինակում" - "Տվյալների վերականգնում"):

Բջջային օպերատորի հետ կապված ժամանակավոր խնդիրներ

Այս դեպքում մնում է միայն սպասել։ Կարող եք զանգահարել օպերատորին և պարզել, թե որքան ժամանակ է նկատվելու MMI-ի հետ կապված սխալը:

Որոշ հավելվածների շահագործում

Արտաքին ներբեռնված որոշ հավելվածներ կարող են կապի սխալ կամ սխալ MMI կոդ պատճառել: Այս կասկածը հաստատելու կամ հերքելու համար բեռնեք ձեր սարքը անվտանգ ռեժիմև փորձեք հարցում կատարել օպերատորին: Եթե ​​լավ է ստացվում, ուրեմն մեղավոր է հեռախոսում տեղադրվածներից ինչ-որ թարմ հավելված, որը պետք է հեռացվի։

Իմացեք, թե ինչպես է ձեր սարքում ձեր գործիքի արտադրողի կայքում: Իմ Samsung-ում դա արվում է այսպես.

  • Նախ անհրաժեշտ է անջատել սարքը, այնուհետև սեղմել այն միացնելու կոճակը, իսկ սարքը միացնելուց հետո պետք է մի քանի վայրկյան սեղմած պահել «Ձայնի իջեցում» կոճակը (մինչ ցուցադրվում են մշակողի լոգոները):
  • Այս քայլերից հետո ձեր սմարթֆոնը (պլանշետը) կգործարկվի անվտանգ ռեժիմի (այս մասին մակագրություն կտեսնեք էկրանի ներքևում), և դուք կարող եք ստուգել դրա աշխատանքը:

Եզրակացություն

Ինչպես տեսնում ենք, կապի խնդիրները և սխալ MMI կոդը սովորաբար պայմանավորված են բջջային օպերատորի ցանցերի անկայունությամբ, ինչպես նաև SIM քարտի ֆիզիկական վատթարացմամբ: Խնդրի պատճառները կարող են լինել նաև հեռախոսի սխալ կարգավորումները, ինչպես նաև երրորդ կողմի հավելվածները, որոնք կարող են անսարքությունների պատճառ դառնալ: շարժական սարքը. Եթե ​​տեսնում եք նման սխալ, ապա առաջին հերթին փորձեք կապ հաստատել ձեր հետ բջջային օպերատոր- Միանգամայն հնարավոր է, որ պատճառը ոչ թե քեզ, այլ նրանն է։

հետ շփման մեջ

USSD ծառայությունները բջջային ցանցի բաժանորդների և սպասարկման սերվերների միջև վաղուց հաստատված ստանդարտներ են: USSD հաղորդագրություններ ուղարկելը հիշեցնում է բոտերի հետ շփվել Telegram-ում և այլ ծառայություններում, որտեղ դրանք լայնորեն օգտագործվում են: Հրաման ուղարկելով՝ օգտատերը ստանում է պատասխան՝ սա կարող է լինել որոշակի տվյալներ կամ տեղեկություններ պահանջվող ծառայության կատարման մասին:

Սմարթֆոնների և հեռախոսների օգտատերերից շատերը չեն էլ պատկերացնում, թե ինչ է իրենից ներկայացնում USSD փոխազդեցության ծառայությունը՝ այն պարբերաբար օգտագործելու ժամանակ։ Հաշվեկշռի ստուգում, փոփոխություն սակագնային պլան, միացնող ծառայություններ - այս ամենը կարելի է անել օպերատորների մեծ մասի հետ բջջային կապ USSD հրամանների միջոցով, ինչպիսիք են՝ *100#, *135#, *105*5# և հազարավոր այլ հրամաններ:

USSD ծառայություն մուտք գործելիս օգտատերը կարող է բախվել հետևյալ բովանդակությամբ սխալի՝ «Միացման խնդիրներ կամ սխալ MMI կոդ»: Նման իրավիճակում դուք պետք է փորձեք կրկին ուղարկել հարցումը՝ համոզվելով, որ այն ճիշտ է։ Եթե ​​նորից տվյալների պահանջը կամ հրամանը ձախողվի, դուք պետք է շտկեք կապը:

Դուք կարող եք տեսնել սխալ MMI կոդի սխալ Android-ում, և տարբերություն չկա, թե որն է բջջային օպերատորօգտագործված՝ Beeline, MTS, Megafon կամ ցանկացած այլ: Ստորև նկարագրված մեթոդներից մեկը պետք է օգնի ազատվել սխալից:

Անվավեր MMI կոդը Android-ի սխալի պատճառով

Google-ը ակտիվորեն հասցնում է Android-ը կատարելության, բայց դա չի փրկում տարբեր սխալների ի հայտ գալուց, հատկապես այն բանից հետո, երբ սմարթֆոն մշակողները ներկայացնում են իրենց սեփական ծառայությունները, պատյանները և օգտատերերի տեղադրումը։ երրորդ կողմի դիմումները. Արդյունքում, MMI սխալ կարող է հայտնվել համակարգում առկա սխալների պատճառով, նման իրավիճակում հեշտ է շտկել այն.

Այս գործողությունները թույլ են տալիս «վերակայել ցանցերը», քանի որ դրանք անջատված են ինքնաթիռի ռեժիմում: Եթե ​​մեթոդը չի աշխատում, կարող եք նաև փորձել վերագործարկել սմարթֆոնը:

MMI կապի խնդիրներ բջջային կապի պատճառով

Հաճախ «Միացման խնդիրներ կամ սխալ MMI կոդ» սխալը տեղի է ունենում SIM քարտի կամ բջջային կապի հետ կապված խնդրի պատճառով: Հեռացրեք քարտը սմարթֆոնից և ստուգեք այն վնասվածության, ինչպես նաև կոնտակտների վրա կեղտոտ լինելու համար, անհրաժեշտության դեպքում սրբեք դրանք։ Ուշադրություն դարձրեք նաև սմարթֆոնի կոնտակտային պահոցին և անհրաժեշտության դեպքում մաքրեք այն: Հաջորդը, տեղադրեք SIM քարտը տեղում և փորձեք նորից ուղարկել USSD հարցումը:

Եթե ​​SIM քարտի կոնտակտների մաքրումը չլուծեց խնդիրը, կարող եք փորձել սահմանել ֆիքսված ցանցի տեսակը: Հնարավոր է, որ խնդիրը պայմանավորված է վատ Կապև ազդանշանի մշտական ​​կորուստ բջջային կապ. Նման իրավիճակում Android սմարթֆոնի վրա դուք պետք է գնաք.

«Կարգավորումներ» - «Ավելին» - « Անլար ցանց» - « Բջջային ցանցեր» - «Ցանցի տեսակը»

Նախնականի փոխարեն ընտրեք հասանելի ցանցի տեսակներից մեկը: Օրինակ, եթե սմարթֆոնը կապվում է օպերատորի հետ LTE-ի միջոցով, դրեք 2G կամ 3G:

Կարևոր է.Փորձեք մուտք գործել USSD ծառայություն ցանցի բոլոր տեսակներից:

Ծայրահեղ դեպքերում կարող եք փորձել լուծել խնդիրը՝ փոխարինելով SIM քարտը՝ կապ հաստատելով բջջային հեռախոսների սրահի հետ:

Android-ում MMI սխալը շտկելու լրացուցիչ եղանակներ

Եթե ​​վերը նշված մեթոդներից և ոչ մեկը չօգնեց, կարող եք փորձել վերադարձնել սմարթֆոնը այն վիճակին, որում այն ​​եղել է մինչև սխալի առաջացումը: Օրինակ, եթե վերջին օրերին սարքի ընտրանքներում փոփոխություններ են տեղի ունեցել կամ հավելվածներ են տեղադրվել, բոլոր նոր տարրերը պետք է ջնջվեն, իսկ կարգավորումները պետք է սահմանվեն նախկին արժեքներին:

Մեկ այլ մեթոդ, որը հաճախ օգնում է ազատվել MMI կոդի անվավեր սխալից, հնարավոր սխալ հարցում ուղարկելն է: Խորհուրդ է տրվում ուղարկել «*100#» հրամանը՝ «*100#» հարցման փոխարեն, այսինքն՝ վերջում ստորակետով։ Թիվ հավաքելիս սմարթֆոնի ստեղնաշարի վրա ստորակետ դնելու համար հարկավոր է սեղմած պահել «աստղանիշը»։

Եթե ​​սխալը չի ​​անհետանում վերը նկարագրված բոլոր եղանակներով այն շտկելուց հետո, կարող եք փորձել վերականգնել հեռախոսը գործարանային կարգավորումներին կամ ամբողջությամբ վերակայել այն: Խնդրում ենք նկատի ունենալ, որ այս դեպքում որոշ տվյալներ կարող են անդառնալիորեն կորչել:

Adobe Premiere Pro-ում հավաքագրման սխալը օգտվողների շրջանում ամենատարածվածներից է: Այն ցուցադրվում է ստեղծված նախագիծը համակարգիչ արտահանելիս: Գործընթացը կարող է ընդհատվել անմիջապես կամ հետո որոշակի ժամանակ. Եկեք տեսնենք, թե ինչ է խնդիրը:

Ինչու է Adobe Premiere Pro-ում կազմման սխալ առաջանում

Կոդեկի սխալ

Շատ հաճախ այս սխալը տեղի է ունենում արտահանման ձևաչափի և համակարգում տեղադրված կոդեկ փաթեթի անհամապատասխանության պատճառով: Նախ փորձեք տեսանյութը պահել այլ ձևաչափով: Եթե ​​ոչ, ապա տեղահանեք նախորդ կոդեկների փաթեթը և տեղադրեք նորը: Օրինակ Արագ ժամանակ, որը լավ համակցված է Adobe ապրանքային գծի արտադրանքի հետ:

Մենք գնում ենք «Կառավարման վահանակ-Ավելացնել/հեռացնել ծրագրեր», գտեք անհարկի կոդեկների փաթեթը և ջնջեք այն ստանդարտ եղանակով։

Այնուհետև մենք գնում ենք պաշտոնական կայք Արագ ժամանակ, ներբեռնեք և գործարկեք տեղադրման ֆայլ. Տեղադրումն ավարտվելուց հետո վերագործարկեք համակարգիչը և գործարկեք Adobe Premiere Pro-ն:

Բավարար ազատ սկավառակի տարածություն չկա

Հաճախ դա տեղի է ունենում տեսանյութերը որոշակի ձևաչափերով պահելու ժամանակ: Արդյունքում, ֆայլը դառնում է շատ մեծ և պարզապես չի տեղավորվում սկավառակի վրա: Որոշեք, արդյոք ֆայլի չափը համապատասխանում է ընտրված բաժանման ազատ տարածությանը: Մենք գնում ենք համակարգչի մոտ և նայում: Եթե ​​բավարար տարածք չկա, ապա մենք ջնջում ենք ավելցուկը սկավառակից կամ արտահանում ենք այլ ձևաչափով։

Կամ մենք նախագիծն արտահանում ենք այլ վայր:

Ի դեպ, այս մեթոդը կարող է կիրառվել նույնիսկ այն դեպքում, եթե կա սկավառակի բավարար տարածք: Երբեմն դա օգնում է լուծել այս խնդիրը:

Փոխել հիշողության հատկությունները

Երբեմն այս սխալը կարող է առաջանալ անբավարար հիշողության պատճառով: Adobe Premiere Pro-ում հնարավոր է մի փոքր բարձրացնել դրա արժեքը, բայց պետք է սկսել ձայնի ձայնից ընդհանուր հիշողությունև թողեք որոշ լուսանցք այլ հավելվածների աշխատանքի համար:

Մենք գնում ենք «Edit-Preferences-Memory-RAM հասանելի է»և սահմանեք ցանկալի արժեքը Պրեմիերայի համար:

Այս վայրում ֆայլեր պահելու թույլտվություններ չկան

Սահմանափակումը հեռացնելու համար անհրաժեշտ է կապվել համակարգի ադմինիստրատորի հետ:

Ֆայլի անունը եզակի չէ

Ֆայլը համակարգիչ արտահանելիս այն պետք է ունենա յուրահատուկ անուն: Հակառակ դեպքում այն ​​չի վերագրվի, այլ պարզապես սխալ կտա, այդ թվում՝ կոմպիլյացիան։ Սա հաճախ տեղի է ունենում, երբ օգտվողը կրկին ու կրկին պահպանում է նույն նախագիծը:

Սլայդերներ Աղբյուր և Արդյունք բաժիններում

Ֆայլ արտահանելիս նրա ձախ մասում կան հատուկ սահիկներ, որոնք կարգավորում են տեսանյութի երկարությունը։ Եթե ​​դրանք սահմանված չեն իրենց ամբողջ երկարությամբ, և արտահանման ժամանակ սխալ է տեղի ունենում, սահմանեք դրանք իրենց սկզբնական արժեքներին:

Խնդրի լուծում՝ ֆայլը մասերի պահպանմամբ

Շատ հաճախ, երբ այս խնդիրն առաջանում է, օգտվողները վիդեո ֆայլը պահում են մասերով: Նախ անհրաժեշտ է գործիքի միջոցով այն կտրել մի քանի մասի «Սայր».

Այնուհետև օգտագործելով գործիքը "Մեկուսացում"նշեք առաջին հատվածը և արտահանեք այն: Եվ այսպես բոլոր մասերի հետ: Դրանից հետո տեսանյութի մասերը կրկին բեռնվում են Adobe ծրագիր Premiere Pro և միացեք: Հաճախ խնդիրը անհետանում է:

Անհայտ սխալներ

Եթե ​​մնացած ամեն ինչ չհաջողվի, դուք պետք է կապվեք աջակցության հետ: Քանի որ Adobe Premiere Pro-ում հաճախ են լինում սխալներ, որոնց պատճառը մի շարք անհայտների է պատկանում։ լուծել դրանք սովորական օգտվողմիշտ չէ, որ հնարավոր է.

Ծրագրի խնդրանքով ձայնային ենթահամակարգը կարող է օգտագործել երեք ծանուցման տարբերակ՝ սահմանել ծրագրի իրադարձության օբյեկտը (իրադարձություն), զանգահարել նշված ծրագրի գործառույթը (հետադարձ զանգ), կամ ուղարկել հաղորդագրություն նշված պատուհանին կամ առաջադրանքին (թել): Առաջին տարբերակում ծրագիրը տեղեկատվություն է ստանում միայն ձայնային ենթահամակարգում ինչ-որ իրադարձության բուն փաստի մասին և ինքը պետք է պարզի, թե կոնկրետ ինչ է տեղի ունեցել. երկրորդ և երրորդ տարբերակներում փոխանցվում են իրադարձության ծածկագիրը և ճշտող տեղեկատվությունը։

Ձայնային ենթահամակարգը ծրագրին ուղարկում է երեք տեսակի իրադարձությունների ծանուցումներ՝ սարքի հաջող բացում, սարքի հաջող փակում և վարորդի հերթից հաջորդ բուֆերի մշակման ավարտ։ Խստորեն ասած, միայն վերջին իրադարձությունն է լիովին ասինխրոն; առաջին երկուսը տեղի են ունենում սարքի հաջող բացումից և փակումից անմիջապես հետո և փոխանցվում են ծրագրին մինչև համապատասխան ինտերֆեյսի գործառույթներից վերադառնալը:

Ծանուցում պատուհանին կամ առաջադրանքին հաղորդագրություն ուղարկելով

Ձայնային ենթահամակարգը Windows-ի հաղորդագրություն է ուղարկում նշված պատուհանին կամ առաջադրանքին, որի կոդը արտացոլում է իրադարձությունը՝ հաղորդագրության պարամետրերում փոխանցելով բաց ձայնային սարքի բանալին և Լրացուցիչ տեղեկությունմիջոցառման մասին։ Հաղորդագրությունն ուղարկվում է ասինխրոն՝ օգտագործելով գործառույթները փակցնել հաղորդագրությունկամ PostThreadMessageև ընտրվում է պատուհանից կամ առաջադրանքների հերթից՝ Windows-ի այլ հաղորդագրությունների հետ միասին:

Հաղորդագրությունների կոդերի հաստատունների անունները նման են MM_WxM_իրադարձություն, Որտեղ x- սարքի տեսակը (տառ Ի- մուտքային սարքի համար կամ Օ- ելքային սարքի համար), և իրադարձություն- միջոցառման տեսակը.

Հաղորդագրություններ MM_WxM_OPENԵվ MM_WxM_CLOSEուղարկվել է երկու տեսակի սարքերի, և MM_WIM_DATAԵվ MM_WOM_Կատարված է- համապատասխանաբար միայն մուտքային կամ ելքային սարքեր:

Բոլոր հաղորդագրությունների պարամետրում wParamփոխանցում է սարքի բանալին, որն առաջացրել է իրադարձությունը: Հաղորդագրություններում ՏՎՅԱԼՆԵՐ/ԿԱՏԱՐԱԾպարամետր lՊարամփոխանցում է վերադարձված աուդիո բուֆերի վերնագրի ցուցիչը:

Ձայնային ենթահամակարգի հաղորդագրությունները չեն պահանջում վերադարձի արժեք այն գործառույթից, որը մշակում է դրանք:

Ծրագրի գործառույթի զանգի ծանուցում

Ձայնային ենթահամակարգը կանչում է նշված ծրագրի ֆունկցիան՝ իր արգումենտներում փոխանցելով կոդը և իրադարձության պարամետրերը։ Կոչված ֆունկցիայի նախատիպն ունի հետևյալ տեսքը.

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

Բռնակ- ձայնային սարքի ստեղն: Ունի տեսակ HWAVEINկամ HWAVEOUT; թույլատրվում է ընդհանուր տեսակը HWAVE.

msg- միջոցառման կոդը: Իրադարձության կոդի հաստատունները նույն անուններն ունեն, ինչ պատուհանի/առաջադրանքի հաղորդագրության կոդի հաստատունները, բայց առանց նախածանցի MM_ (WIM_OPEN, WOM_ԿԱՏԱՐՎԱԾև այլն): Փաստորեն, դրանք այժմ սահմանված են MMSYSTEM.Hորպես նախածանցային հաստատունների համարժեք MM_սակայն, դա չպետք է սպասել ապագայում:

Օրինակ- սարքը բացելիս ծրագրի կողմից նշված 32-բիթանոց տեղեկատվական բառ: Ձայնային ենթահամակարգը ոչ մի կերպ չի օգտագործում այս արժեքը, այլ միայն փոխանցում է այն յուրաքանչյուր ֆունկցիայի կանչի ժամանակ:

Պարամ 1, Պարամ 2- իրադարձության պարամետրեր. Միջոցառումների համար ԲԱՑԵվ ՓԱԿԵԼիմաստը Պարամ 1հավասար է զրոյի; միջոցառումների համար ՏՎՅԱԼՆԵՐԵվ ԿԱՏԱՐԱԾայս պարամետրը փոխանցում է վերադարձված աուդիո բուֆերի վերնագրի ցուցիչը: Իմաստը Պարամ 2ընթացիկ իրականացման դեպքում միշտ զրո է:

Ֆունկցիան կարող է կանչվել ընդհատման կարգավորիչի համատեքստում, ուստի այն կարող է ապահով կերպով օգտագործել միայն սահմանափակ շարք Windows-ի առանձնահատկությունները: EnterCriticalSection, Թողնել CriticalSection, midiOutLongMsg, midiOutShortMsg, OutputDebugString, փակցնել հաղորդագրություն, PostThreadMessage, SetEvent, timeGetSystemTime, timeGetTime, timeKillEvent, timeSetEvent. Ձեռք մեկնել ուրիշներին համակարգի գործառույթները, ինչպես նաև աուդիո ենթահամակարգի գործառույթների նկատմամբ կարող են անկանխատեսելի հետևանքներ առաջացնել:

Ֆունկցիան կանչելու համար ձայնային ենթահամակարգը ստեղծում է առանձին առաջադրանք (թել) ավելի բարձր (ABOVE_NORMAL) առաջնահերթությամբ: Ի տարբերություն հաղորդագրության փոխանցման, որը մշակվում է առաջինը, առաջինը սպասարկվող սկզբունքով, ֆունկցիայի կանչը տեղի է ունենում գործընթացի մյուս առաջադրանքների աշխատանքին զուգահեռ, ուստի պետք է ուշադրություն դարձնել գործառույթի և այլ առաջադրանքների հասանելիությունը ընդհանուր փոփոխականներին և տվյալների կառուցվածքներին համաժամեցնելու համար:

Օգնական առաջադրանքը ստեղծվում է մեկ անգամ և գոյություն ունի մինչև գործընթացի ավարտը: Ձայնային ենթահամակարգն այս առաջադրանքից ծանուցման գործառույթներ է կանչում բոլոր սարքերի համար, որոնք բաց կլինեն գործընթացի ողջ ընթացքում:

Աուդիո սարքերի ինտերֆեյսի գործառույթների մի շարք

Հետագայում մենք հավատարիմ կմնանք գործառույթների անվանման համընդհանուր համակարգին՝ նշելով անվան միայն իմաստային մասը և բաց թողնելով սարքի տեսակը և «կողմնորոշումը» պարունակող նախածանցը: Օրինակ, GetDevCaps ֆունկցիայի մասին խոսելիս նկատի կունենանք երկու ֆունկցիա. waveInGetDevCapsԵվ waveOutGetDevCaps, բացատրելով միայն դրանց տարբերությունները մուտքային և ելքային սարքերի համար: Սա կպահանջի ընթերցողից «կառուցել» գործառույթի ամբողջական անվանումը յուրաքանչյուր դեպքի հիման վրա, սակայն նկարագրությունը կդարձնի ավելի լայն և համակարգված: Ֆունկցիայի նախատիպում նախածանցը կնշանակվի «» հաջորդականությամբ: xxx».

Գործառույթների մեծ մասի առաջին պարամետրը բաց ձայնային սարքի բանալին (բռնակն) է, որն ունի տեսակը HWAVEINկամ HWAVEOUT; նախատիպում նշվում է նրա տեսակը HWAVEx. Ինչպես արդեն նշվեց, աուդիո սարքի ստեղները կարող են պահվել համատեղելի տիպի փոփոխականներում HWAVE.

Ինտերֆեյսի գործառույթների ցանկ

Հարցման սարքերի քանակը

Հարցրեք սարքի կարգավորումներն ու հնարավորությունները

Սարքի բացում

Սարքի փակում

Ձայնային բուֆերի պատրաստում (ֆիքսում հիշողության մեջ):

Աուդիո բուֆերի ազատում (ապամրացում):

AddBuffer/Write

Հաջորդ բուֆերի փոխանցում սարքի վարորդին

Դադարեցնել ձայնագրումը/նվագարկումը

Սկսել ձայնագրումը/նվագարկումը

Վերականգնել հոսքը

SetVolume / GetVolume

Նվագարկման ձայնի կարգավորում/պահանջում

SetPitch/GetPitch

Նվագարկման ընթացքում հնչյունի կարգավորում/հարցում

SetPlaybackRate / GetPlaybackRate

Նվագարկման արագության կարգավորում/պահանջում

Խնդրեք սարքի համարը բանալիով

Հարցրեք սխալի տեքստը կոդով

Վարորդին հատուկ հաղորդագրություն ուղարկելը

Ինտերֆեյսի գործառույթներով վերադարձված արժեքներ

Հազվագյուտ բացառություններով, բոլոր աուդիո ինտերֆեյսի գործառույթները վերադարձնում են նման արդյունք MM ԱՐԴՅՈՒՆՔ, տիպին համարժեք UINT. Իմաստը MMSYSERR_NOERROR, ընթացիկ իրականացման մեջ հավասար է զրոյի, նշանակում է ֆունկցիայի հաջող կատարում, ցանկացած այլ արժեք ցույց է տալիս սխալ: Սխալի կոդի հաստատունները նախածանցված են MMSYSERR_(ընդհանուր մուլտիմեդիա ենթահամակարգի սխալ) և WAVERR_(Ալիքի սարքի վարորդի սխալ).

MMSYSERR_BADDEVICEID

Սարքի անվավեր համար

MMSYSERR_NOTENABLED

Վարորդն ակտիվացված չէ

MMSYSERR_ALLOCATED

Սարքը զբաղված է մեկ այլ հավելվածով

MMSYSERR_INVALHANDLE

Անվավեր հանրային սարքի բանալի

MMSYSERR_NODRIVER

Վարորդը կորել է

Հիշողությունը բավարար չէ

MMSYSERR_NOTSUPPORTED

Պահանջվող հատկությունը չի աջակցվում:

MMSYSERR_BADERRNUM

Սխալի կոդը տիրույթից դուրս է

MMSYSERR_INVALFLAG

Անվավեր դրոշակ

MMSYSERR_INVALPARAM

Անվավեր պարամետր

MMSYSERR_HANDLEBUSY

Մեկ այլ առաջադրանքից բանալու վրա կատարվում է գործողություն

Չսահմանված սխալ

MMSYSERR_NODRIVERCB

Վարորդը չի հետևել ծանուցմանը (հետազանգ)

WAVERR_BADFORMAT

Հեռարձակման անվավեր կամ չաջակցվող ձևաչափ

WAVERR_STILLPLAYING

Ձայնագրումը կամ նվագարկումն ընթացքի մեջ է

WAVERR_UNPREPARED

Բուֆերը պատրաստ չէ

Սարքն աշխատում է միայն համաժամանակյա ռեժիմում

GetDevCaps - պահանջելու պարամետրեր և սարքի հնարավորություններ

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

Ծառայում է սարքի պարամետրերն ու հնարավորությունները որոշելու համար։

DevId- սարքի համարը սկսած զրոյից, կամ նախկինում բացված սարքի բանալին կամ հաստատուն WAVE_MAPPER. Վերջին դեպքում վերադարձվում են ստանդարտ համակարգի սարքի պարամետրերը:

Կափարիչներ- WAVEINCAPS կամ WAVEOUTCAPS տիպի կառուցվածքի ցուցիչ (կան հատուկ տեսակներ LPWAVEINCAPSԵվ LPWAVEOUTCAPS).

CapsSize- կառուցվածքի չափը բայթերով:

Հաջողությամբ ավարտվելուց հետո ֆունկցիան սարքի պարամետրերով լրացնում է սլաքի անցած կառուցվածքի դաշտերը։ Եթե ​​պարամետրերը պահանջվել են ալիք քարտեզագրող,ապա վերահղման ծառայության անունը վերադարձվում է որպես սարքի անուն:

Բաց - սարքի բացում

MMRESULT xxxOpen (LPHWAVEx ForHandle, UINT DevId, LPCWAVEFORMATEX ձևաչափ, DWORD Callback, DWORD Instance, DWORD OpenFlags);

ForHandle- մուտքագրեք փոփոխական ցուցիչ HWAVEINկամ HWAVEOUT(ցուցիչի տեսակը - LPHWAVEINկամ LPHWAVEOUT), որի մեջ, գործողությունը հաջողությամբ ավարտվելուց հետո, գրված է բաց սարքի բանալին:

DevId- սարքի համարը սկսած զրոյից, կամ նախկինում բացված սարքի բանալին կամ արժեքը WAVE_MAPPER. Վերջին դեպքում վերաքարտեզագրման ծառայությունն ընտրում է տվյալ ֆորմատն ապահովող սարք, և որոնումը սկսվում է ստանդարտ համակարգի սարքից։

Ձևաչափ- ցուցիչ դեպի WAVEFORMATEX տիպի կառուցվածք, որը նկարագրում է հոսքի պահանջվող ձևաչափը:

ետ Զանգիր- օբյեկտ, որին կուղարկվեն վարորդի ծանուցումներ պահանջվող գործողությունների կատարման մասին: Այն սահմանվում է պատուհանի կամ իրադարձության ստեղնով (բռնակով), ֆունկցիայի ցուցիչով կամ առաջադրանքի նույնացուցիչով (թելերի id):

Օրինակ- 32-բիթանոց տեղեկատվական բառ, որը կփոխանցվի վարորդի կողմից ծանուցման ֆունկցիայի զանգի պարամետրերում: Օրինակ, ձայնային սարքերի հետ ընդհանուր ինտերֆեյս մշակելիս սա կարող է լինել սարքի նկարագրիչի ցուցիչ (կառուցվածք կամ դասի օբյեկտ):

Բացեք դրոշները- սարքի բացման և շահագործման ռեժիմների դրոշներ.

Վարորդը չի ծանուցի ծրագրին, որ գործողությունները կատարվել են: Այս ռեժիմը օգտագործվում է լռելյայն

Պարամետր ետ Զանգիրմիջոցառման օբյեկտի բանալին է (իրադարձության բռնակ)

Պարամետր ետ Զանգիրառաջադրանքի նույնացուցիչն է (թեմայի id)

Պարամետր ետ Զանգիրպատուհանի բռնակն է

CALLBACK_FUNCTION

Պարամետր ետ Զանգիրֆունկցիայի ցուցիչ է

WAVE_FORMAT_QUERY

Ձևաչափեք հարցումների ռեժիմը: Վարորդը միայն ստուգում է, արդյոք նշված սարքը կարող է բացվել պահանջվող ձևաչափով և ռեժիմներով, և վերադարձնում է համապատասխան արդյունքի կոդը: Այս ռեժիմում պարամետրը ForHandleկարող է զրոյական լինել ( ԴԱՏԱՐԿ)

WAVE_FORMAT_DIRECT

Անջատում է Wave Mapper-ը և ACM-ը հոսքի ձևաչափի փոխարկմանը մասնակցելուց: Ամբողջ հաղորդակցությունը միայն վարորդի և հավելվածի միջև է:

Թույլ է տալիս սարքը բացել համաժամանակյա ռեժիմում: Լիովին համաժամանակյա սարքերի համար այս դրոշը պետք է նշվի:

Թույլ է տալիս Wave Mapper-ին և ACM-ին խանգարել ծրագրի և սարքի վարորդի միջև ձայնային հաղորդակցությանը

Սարքի հաջող բացման դեպքում (եթե ձևաչափի հարցման դրոշը սահմանված չէ), ձայնային ենթահամակարգը վերադառնում է ցուցիչի կողմից նշված փոփոխականին: ForHandle, բաց սարքի բանալի (բռնակ):

Ներածման սարքերը բացվում են «stop» ռեժիմով, և ձայնային բուֆերները վարորդին փոխանցելը չի ​​հանգեցնում ավտոմատ մեկնարկգրառումներ - դրա համար անհրաժեշտ է զանգահարել Start ֆունկցիան: Ելքային սարքերը անմիջապես բացվում են նվագարկման ռեժիմում, և երբ առաջին ձայնային բուֆերը փոխանցվում է վարորդին, դրա նվագարկումն ինքնաբերաբար սկսվում է:

Երբ ավարտեք սարքի հետ աշխատանքը, այն պետք է փակեք փակել գործառույթով, հակառակ դեպքում բաց սարքը կարող է «կախվել»: Ի տարբերություն ֆայլային համակարգի, Windows-ի ձայնային ենթահամակարգը շատ ավելի զգայուն է սխալների նկատմամբ և միշտ չէ, որ կարողանում է հետևել ծրագրի դադարեցմանը ձայնային սարքերը խափանելու համար:

PrepareHeader - նախապատրաստում է բուֆերը և դրա վերնագիրը վարորդին փոխանցելու համար

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

hdr

HՉափ

Պատրաստում է աուդիո բուֆերը վարորդին փոխանցելու համար: Սովորաբար նախապատրաստումը բաղկացած է բուֆերի հիշողության մեջ ամրացնելուց, որպեսզի պրոցեսորից դուրս փոխանցման ժամանակ (DMA) այն չհարկադրվի (դուրս հանվի) սկավառակի վրա: Ձայնային ենթահամակարգը դրոշակ է դնում պատրաստված բուֆերի վերնագրում WHDR_ՊԱՏՐԱՍՏՎԱԾ.

Ֆունկցիան կանչելուց առաջ բուֆերային վերնագրի դաշտերը պետք է լրացվեն lpData, dwBufferLength, dwԴրոշներ.

Արդեն պատրաստված բուֆերի համար ֆունկցիան ոչինչ չի անում և հաջողվում է։

Write/AddBuffer - ձայնային բուֆերի փոխանցում վարորդին

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

hdr- աուդիո բուֆերային վերնագրի ցուցիչ:

HՉափ- վերնագրի կառուցվածքի չափը.

Նվագարկման համար ձայնային բուֆեր է փոխանցում վարորդին ( Գրել) կամ գրելու համար ( AddBuffer) Բուֆերը պետք է պատրաստվի Prepare ֆունկցիայով, հակառակ դեպքում վարորդը կհրաժարվի ընդունել այն:

Ստանալով բուֆերը՝ վարորդը վերակայում է WHDR_DONE դրոշը իր վերնագրում, վերնագիրը ներառում է ներքին հերթում և սահմանում WHDR_INQUEUE դրոշակը: Դրանից հետո ասինխրոն դրայվերը վերադարձնում է հսկողությունը հավելվածին՝ շարունակելով բուֆերային հերթի զուգահեռ մշակումը սարքի ընդհատումների վրա. սինխրոն դրայվերը վերադարձնում է կառավարումը միայն բուֆերը մշակելուց հետո:

Ավարտելով հաջորդ բուֆերի մշակումը, վարորդը հեռացնում է այն հերթից, վերակայում է WHDR_INQUEUE դրոշը, այնուհետև սահմանում է WHDR_DONE դրոշը, որից հետո կատարում է հավելվածի ծանուցում, եթե այն պահանջվել է սարքը բացելիս: Այնուհետև վարորդը շարունակում է հերթում հաջորդ բուֆերի մշակումը:

Հավելվածին չի թույլատրվում փոխել վերնագրի որևէ դաշտ, քանի դեռ բուֆերը չի մշակվել վարորդի կողմից:

Քանի որ բուֆերային վերնագիրն ունի միայն մեկ դաշտ՝ ցանկի մեջ կապելու համար, վարորդին նորից հերթագրված բուֆեր ուղարկելը հանգեցնում է սխալի:

Սկսել/Վերագործարկել - սկսել ձայնագրումը/նվագարկումը

MMRESULT waveInStart (HWAVEx Handle); MMRESULT waveOutRestart (HWAVEx Handle);Սկսում է ձայնագրումը/նվագարկումը հոսքի ընթացիկ դիրքից:

Ակտիվ շղթայով ֆունկցիան ոչինչ չի անում և հաջողվում է։

BreakLoop - ընդհատել ընթացիկ հանգույցը

MMRESULT waveOutBreakLoop (HWAVEx Handle);

Վերականգնում է նվագարկման հանգույցի ռեժիմը, եթե այն սահմանված է: Ընթացիկ հանգույցի անցումը նվագարկվում է մինչև վերջ, այնուհետև նվագարկումը շարունակվում է գծային՝ առանց վերադառնալու առաջին հանգույցի բուֆեր: Օղակային բուֆերների խումբը վերադարձվում է ծրագիր, երբ յուրաքանչյուրն ավարտում է նվագարկումը:

Երբ շարանը դադարեցվում է կամ հանգույց չկա, ֆունկցիան ոչինչ չի անում և հաջողվում է։

SetVolume - նվագարկման ձայնի կարգավորում

MMRESULT waveOutSetVolume (HWAVEx Handle, DWORD Volume);

Ծավալը- Ձախ և աջ ալիքների ձայնը: Ցածր բառը սահմանում է ձախ ալիքի ձայնը, բարձր բառը սահմանում է աջի ձայնը: 0xFFFF արժեքը սահմանում է առավելագույն ծավալը, 0-ը՝ նվազագույնը: Ադապտերների համար, որոնք չեն աջակցում ալիքի ձայնի անկախ կառավարում, ցածր բառը նշում է ուղու երկու ալիքների ձայնը:

Ֆունկցիան սահմանում է վերարտադրվող ազդանշանի ելքային մակարդակը: Չնայած գործառույթը թույլ է տալիս 65536 ձայնի մակարդակ, ադապտերների մեծ մասն աջակցում է միայն 8-ից 256 ձայնի մակարդակի: Նման դեպքերում բարձրաձայնության արժեքի միայն երեքից ութ ամենակարևոր թվանշաններն են նշանակալի, իսկ ամենաքիչ նշանակալից թվերն անտեսվում են: Այս մեկնաբանությունը թույլ է տալիս օգտագործել նույն ծավալի սանդղակը, փոխելով միայն ճշգրտման քայլերի աստիճանը:

Ֆունկցիան աջակցվում է միայն ադապտերների կողմից, որոնք իրենց հատկություններում ունեն WAVECAPS_VOLUME դրոշակ: Առանձին կարգավորումն ըստ ալիքների աջակցվում է միայն այն դեպքում, եթե առկա է WAVECAPC_LRVOLUME դրոշը:

SetPitch / SetPlaybackRate - բարձրության / նվագարկման արագության կարգավորում

MMRESULT waveOutSetPitch (HWAVEx Handle, DWORD Multiplier); MMRESULT waveOutSetPlaybackRate (HWAVEx Handle, DWORD Multiplier); բազմապատկիչ- բազմապատկիչ բարձրության / նվագարկման արագության համար: Բարձր բառը նշում է բազմապատկիչի ամբողջական մասը, ցածր բառը՝ կոտորակային մասը։ Եթե ​​կա բազմապատկիչ արժեք զտիպ կրկնակի, այնուհետև այն փոխարկեք տիպի DWORDդա հնարավոր է բանաձևով.

Բազմապատկիչ = (DWORD) (f * 0x10000)

Գործառույթները փոխում են հոսքի ձայնի բարձրությունը կամ նվագարկման արագությունը՝ առանց փոխելու հոսքի ցուցադրման ընտրանքային արագությունը: Բազմապատկիչի արժեքը պետք է լինի դրական: Լռելյայնորեն, բազմապատկիչը դրված է 1.0-ի վրա, ինչը նշանակում է, որ հոսքը կխաղա բնական բարձրությամբ և արագությամբ:

Երբ փոխում եք բարձրությունը, հոսքի բոլոր հնչյունները դառնում են ավելի բարձր կամ ցածր, բայց յուրաքանչյուր ձայնի տևողությունը և նվագարկման ընդհանուր ժամանակը պահպանվում են: Նվագարկման արագությունը փոխելը նման է մագնիտոֆոնի ժապավենի արագությունը փոխելուն. բոլոր ձայները դառնում են ավելի բարձր կամ ցածր, իսկ նվագարկման ընդհանուր ժամանակը համապատասխանաբար նվազում կամ ավելանում է:

Ոչ բոլոր ձայնային ադապտերներն են աջակցում այս զույգ գործառույթներին. որպես կանոն, այն իրականացվում է մասնագիտացված ազդանշանային պրոցեսորների (DSP) վրա: Տեխնիկապես արագության փոփոխությունն ամենահեշտ է իրականացվում, որի համար առկա նմուշների միջև ընկած կետերում միջանկյալ նմուշները հաշվարկվում են ինտերպոլացիայի միջոցով՝ քիչ թե շատ հետևելով միմյանց, որոնք սնվում են DAC միացում: Բարձրությունը փոխելը պահանջում է շատ ավելի բարդ հաշվարկներ. հոսքի բեկորները քայքայվում են Ֆուրիեի շարքի` ձևավորելով ձայնային սպեկտր, այնուհետև սպեկտրը տեղափոխվում է դեպի բարձր կամ ցածր հաճախականություններ, որից հետո փոփոխված սպեկտրից կրկին ձևավորվում է նոր ձայնային հոսքի բեկոր:

Ադապտերների համար, որոնք աջակցում են բարձրության և/կամ տոկոսադրույքի փոփոխություններին, GetDevCaps ֆունկցիան սահմանում է համապատասխանաբար WAVECAPS_PITCH և WAVECAPS_PLAYBACKRATE դրոշները:

GetID - սարքի համարը պահանջեք բանալիով

MMRESULT xxxGetID (HWAVEx Handle, LPUINT ForID);

ID-ի համար- մուտքագրեք փոփոխական ցուցիչ UINT, որը պարունակում է սարքի համարը։

Գործառույթը որոշում է սարքի համարը, որի բացումից հետո համակարգը վերադարձրել է նշված բանալին: Այն դեպքում, երբ բացման ժամանակ օգտագործվել է վերահղման ծառայությունը (արժեք WAVE_MAPPERթվի կամ WAVE_MAPPED դրոշի փոխարեն), ֆունկցիան արժեք է վերադարձնում WAVE_MAPPER.

Microsoft-ի փաստաթղթերը պնդում են, որ այս հատկությունը աջակցվում է միայն համատեղելիության համար, և որ համարը ստանալու համար բավական է բանալին գցել ցանկալի տեսակի վրա, բայց դա ամենևին էլ այդպես չէ: Հանրային սարքի բանալին աուդիո ենթահամակարգին պատկանող նկարագրիչի հասցեն է, և Win32-ում գտնվում է ընդհանուր հիշողության տարածքում: Սարքի համարը բանալիով ստանալու միակ միջոցը ֆունկցիան օգտագործելն է GetID.

GetErrorText - խնդրեք տեքստային սխալի հաղորդագրություն կոդով

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

սխալ- ինտերֆեյսի գործառույթներից մեկի կողմից վերադարձված սխալի կոդը.

Տեքստ- ցուցիչ դեպի տեքստային բուֆեր (տեսակի զանգված նիշ);

տեքստի չափը- տեքստի բուֆերի չափը բայթերով:

Ֆունկցիան նշված կոդով մուտքագրում է սխալի տեքստային նկարագրությունը նշված բուֆերում: Գրավոր տեքստն ավարտվում է զրոյական բայթով: Եթե ​​բուֆերը բավականաչափ մեծ չէ, ապա տեքստի վերջը կտրված է. զրոյական բայթ, այնուամենայնիվ, գրվում է բուֆերում: Բուֆերի չափը, որը կարող է պահել ցանկացած սխալի հաղորդագրություն, որոշվում է հաստատունով MAXERRORL ԵՐԿՈՒՅԹ.

Սխալի հաղորդագրությունները չեն բաժանվում ըստ սարքի տեսակի, ուստի ստորև նշվածներից որևէ մեկը բավարար է ցանկացած սխալի տեքստը պահանջելու համար: հնարավոր գործառույթները, Օրինակ waveOutGetErrorText.

Հաղորդագրություն - հաղորդագրություն ուղարկեք վարորդին

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

msg- փոխանցված հաղորդագրության կոդը:

P1, P2- հաղորդագրության պարամետրեր:

Ֆունկցիան օգտագործվում է անմիջապես վարորդին հաղորդագրություն ուղարկելու համար: Բոլոր ինտերֆեյսի գործառույթները, բացառությամբ GetID-ի և GetErrorText-ի, աուդիո ենթահամակարգի կողմից թարգմանվում են վարորդին փոխանցված հաղորդագրությունների. յուրաքանչյուր հաղորդագրություն ունի երկու տեսակի պարամետր DWORD, որի մեջ փոխարկվում են ինտերֆեյսի ֆունկցիայի պարամետրերը։ Եթե ​​սարքի վարորդը աջակցում է ոչ ստանդարտ հաղորդագրություններին, դրանք կարող են փոխանցվել դրան՝ օգտագործելով գործառույթները հաղորդագրություն. Վերադարձի արժեքը որոշվում է վարորդի կողմից:

MME աուդիո ենթահամակարգի թերությունները

Windows 95/98-ում MME ենթահամակարգը և դրա դրայվերները մնացին 16-բիթանոց, ինչպես Windows 3.x-ում: Դրա պատճառով, Win32 հավելվածից ձայնային վարորդի յուրաքանչյուր զանգ ուղեկցվում է կատարման ռեժիմի կրկնակի փոփոխությամբ (thunking), որը, ավաղ, հանգեցնում է լրացուցիչ ծախսերի՝ Celeron-366 պրոցեսորների վրա հասնելով մինչև մի քանի միլիվայրկյանների: Բացի այդ, շատ վարորդներ սահմանափակում են օղակի բուֆերի թարմացման հաճախականությունը, որի միջոցով փոխանակումը տեղի է ունենում համակարգչի և ադապտերի միջև, վայրկյանում մի քանի տասնյակ անգամ, ինչը հանգեցնում է ձայնի փոխանցման գործընթացի հետաձգմանը: ISA ադապտերների վարորդների համար այս ուշացումը կարող է հասնել տասնյակ միլիվայրկյանների, իսկ PCI ադապտերների համար այն սովորաբար սահմանափակվում է մի քանի միլիվայրկյանով:

Ավելի արագ ձայնային ելքի համար, հատկապես իր իրական ժամանակի փոփոխությամբ, Microsoft-ը ավելին է զարգացրել նոր ինտերֆեյս - DirectSound. Այս ինտերֆեյսը նախատեսված է «մոտեցնելու» ադապտերների սարքավորումը կիրառական ծրագրին և թույլ է տալիս գրեթե ուղղակիորեն ձայնագրել համակարգի օղակի բուֆերում՝ նվազեցնելով առավելագույն ուշացումները մինչև միլիվայրկյանների ցանկացած ադապտեր: հետ աշխատելիս DirectSoundԾրագիրը ուղղակիորեն մուտք է գործում 32-բիթանոց համակարգի ադապտերների դրայվեր (VxD)՝ շրջանցելով անցումը 32-ից 16-բիթանոց կատարման ռեժիմների միջև:

Որպեսզի արդյունավետ աշխատանքինտերֆեյս DirectSoundպետք է ապահովվի ադապտերի համակարգի դրայվերի կողմից: Սարքերի համար, որոնց դրայվերները չեն աջակցում DirectSound Windows-ը նմանակում է նորմալ MME դրայվերի «վերևում» նոր ինտերֆեյսը, սակայն այս դեպքում բոլոր ուշացումները նույնիսկ ավելանում են էմուլացիայի գերծանրաբեռնվածության պատճառով:

Ցավոք, Microsoft-ը մշակել է ընդլայնման հստակեցում DirectSoundձայնային VxD-ների համար միայն ձայնի վերարտադրման առումով՝ գործելով հիմնականում խաղեր արտադրողների շահերից: Աուդիո ձայնագրությունը միջոցով DirectSoundդեռևս իրականացվում է MME-ով էմուլյացիայի միջոցով:

Ասեմ, որ Windows 3.x և 95/98 ձայնային ենթահամակարգը, ինչպես նաև ենթահամակարգը. հեռավոր մուտքդեպի ցանց (RAS), ունի սխալի ցածր հանդուրժողականություն: Սա ամենից հաճախ դրսևորվում է նրանով, որ երբ ձայնային սարքերը բացող և դրանց հետ աշխատող ծրագիրը խափանում է, համակարգը պատշաճ կերպով չի փակում (մաքրում) օգտագործվող սարքերը: Արդյունքում, որոշ դեպքերում, նման խափանումից հետո, կարող է պահանջվել վերաբեռնում, և մինչ այդ ապակողպված սարքերը անհասանելի կլինեն այլ հավելվածների համար: Բացի այդ, 16-բիթանոց ենթահամակարգերը շատ ավելի քիչ սխալ են պաշտպանում, քան 32-բիթանոց ենթահամակարգերը, ուստի ձայնային ծրագրերի լուրջ սխալները կարող են խափանվել և սառեցնել Windows-ի ամբողջ համակարգը:

Windows NT-ում բոլոր ենթահամակարգերը բնիկ 32-բիթանոց են, ուստի նկարագրված խնդիրները այնտեղ չեն առաջանում, այնուամենայնիվ, աուդիո մուտքի և ելքի հետաձգումները դեռ որոշվում են օղակի բուֆերի թարմացման արագությամբ, որը սահմանվում է հատուկ ադապտեր վարորդի կողմից:

Օրինակ ծրագիր՝ օգտագործելով MME ինտերֆեյսը

Որպես օրինակ, տրված է ծրագիր, որն իրական ժամանակում իրականացնում է հետաձգման էֆեկտը: Էֆեկտի էությունը բնօրինակ ձայնային ազդանշանի ավելացումն է իր պատճենով, ժամանակի հետաձգմամբ փոքր քանակությամբ (միավոր-հարյուր միլիվայրկյաններով): Մինչև 15-20 ms ուշացումն ականջի կողմից ընկալվում է որպես ձայնի աղբյուրի «ջախջախում». Այս սկզբունքի վրա է հիմնված երգչախմբային էֆեկտի ստեղծումը։ 20-50 ms ուշացումն ընկալվում է որպես արձագանք (ծավալի զգացողություն), իսկ մեծ ուշացման արժեքները՝ որպես նորմալ արձագանք:

Նկարագրված էֆեկտների հավատալի ձայն ստանալու համար սովորական է մի քանի հաջորդական ձայնային ուշացումներ կատարել, որոնց դեպքում բնօրինակ ազդանշանի պատճենը աստիճանաբար թուլանում է: Վերոնշյալ ծրագրում, պարզության համար, կատարվում է միայն մեկ ուշացում, և ազդանշանի պատճենը չի թուլանում:

Ծրագիրն իրականացվում է C++-ով։ Իրականում, այն օգտագործում է միայն ընդհանուր ընդլայնումներ C++-ից (հանգույցների վերնագրերում փոփոխականներ սահմանելը, որպես տիպի անուններ օգտագործելով կառուցվածքների անունները և այլն), հակառակ դեպքում կարող ենք ենթադրել, որ այն օգտագործել է սովորական ANSI C լեզուն։

Ծրագիրը մշակվել է MS VC++ 4.2 միջավայրում։ Օգտագործված է միայն ստանդարտ Windows ինտերֆեյս, առանց զարգացման միջավայրից որևէ ընդարձակման:

Ծրագիրը աշխատում է իրական ժամանակում՝ միաժամանակ բացելով երկու ձայնային սարք՝ մուտքային և ելքային: Լրացված ձայնային բուֆերները, որոնք գալիս են մուտքային սարքից, ամփոփվում են դրանց ժամանակով տեղափոխված պատճեններով, որից հետո դրանք ուղարկվում են ելքային սարք. ձայնային բուֆերների ընդհանուր հավաքածուն շրջանառվում է մուտքային և ելքային սարքի միջև:

Բուֆերների շրջանառությունը վերահսկելու համար առանձին աշխատանքային առաջադրանք(աշխատանքային շարանը), որին հատկացվում է առաջնահերթության առավելագույն աճ: Ձայնային սարքերը բացվում են աշխատանքային առաջադրանքների ծանուցման ռեժիմում:

Բուֆերացման պատճառով ծրագրի ձայնը որոշ չափով հետ է մնում բնօրինակից: Բուֆերացման ընդհանուր ժամանակը և ձայնային բուֆերների քանակը սահմանվում են ծրագրի պարամետրերի բաժնում: Անընդհատ ձայնային փոխանցման համար բուֆերների քանակը չպետք է պակաս լինի երկուսից. ընդունելի կայունություն է ձեռք բերվում արդեն երեք կամ չորս բուֆեր օգտագործելու դեպքում:

Ծրագիրը պահանջում է լրիվ դուպլեքս աուդիո ադապտեր, որը թույլ է տալիս միաժամանակյա աշխատանքձեր ADC-ն և DAC-ը: Ժամանակակից ադապտերների մեծ մասը բավարարում է այս պայմանը:

Օրինակ

ComputerPress 6"2000 թ