Moi!
Miten Pythonilla voi säätää Windowsin äänenvoimakkuutta (XP)? Onko jotain kirjastoa, ettei tarvitse hervottomia koodeja mitä netistä löysin? Ehkei paras tapa kumminkaan ole laittaa koodia siirtämään ja klikkailemaan hiirellä.
Muokkaus. Tai, voihan se olla myös komentoriviskripti, koska voihan sen suorittaa Pythonin avulla.
Pikagooglailulla löysin tuommoisen softan: http://www.nirsoft.net/utils/nircmd.html jolla voi siis komentoriviltä muuttaa esim. sitä äänenvoimakkuutta.
Tarkoitus olisi ollut tehdä ilman mitään erillisiä ohjelmia.
WinAPI waveOutSetVolume on se mitä haet. Voit antaa ensimmäisen parametrin kahvaksi 0. Kannattaa huomioida, että Vistassa ja sitä uudemmissa Windowseissa toi muuttaa vain oman ohjelman äänenvoimakkuutta. Jos haluat niissäkin master voluumia säätää, niin saat käyttää IAudioEndpointVolume
COM interfacea, joka ei ole ehkä kauheen kivaa. Tässä vielä esimerkki sen käyttämisestä: How do I change the master volume in Windows Vista
Niin ja tätäkin ehkä tarvitset: How to use win32 API’s with python?
ctypes.windll.winmm.waveOutSetVolume(0, vol)
. Yritän väkertää simppeliä luokkaa, mutta en hanskaa tuota DWORDin luomista niin, että kanavat menisivät oikein (oikea = high-order word ja vasen = low-order). Oma versioni toimii toistaiseksi vain puolesta välistä ylöspäin. Käytin pohjana Ray Schumacherin kirjoittamaa pätkää. Ymmärtääkseni tuossa pyritään säätämään Master Volumea, joskin itselläni tuo vain Mutetti sen.
Tässä vielä jostain napattu dwordin luonti.
def _dWord(self, h, l): return \ (((h & 0x7fff) * 65536) | (l & 0xffff)) | 0x80000000 \ if (h > 32767) else \ (h * 65535) + l
Öö, miksi asetat aina korkeimman bitin ykköseksi? Sen tai ton iffin (jota en jaksa yrittää ymmärtää) takia se varmaan toimiikin vain puolesta välistä ylöspäin xD
def _dWord(self, h, l): return ((h & 0xffff) << 16) | (l & 0xffff)
Varmaan auttas jos muistas jotain bittien pyörittelystä :). Juu, arvailin just saman kasaan,
vol = c_ulong((volume & 0x0000FFFF) + (volume << 16))
tsuriga kirjoitti:
ctypes.windll.winmm.waveSetOutVolume(0, vol)
Mitä kaikkea pitää lisätä import-listaan koodin alussa tätä varten? Toimiiko tämä ihan tuollaisenaan?
Pieni lapsus, waveOutSetVolume(0, vol). Alkuun [t]import ctypes
.
Eli siis millaisessa muodossa äänenvoimmakkuus pitäisi antaa? Käyttäjä antaa äänenvoimmakkuuden 0-100, miten se pitäisi muuttaa tuohon kummalliseen formaattiin?
MSDN:stä tämäkin selviäisi. Se formaattihan menee niin, että waveSetOutVolumelle annetaan 32bittinen muuttuja, jonka kaks ylempää tavua kertoo oikean kanavan äänenvoimakkuuden ja kaksi alempaa tavua vasemman kanavan äänenvoimakkuuden. Haluat luultavasti asettaa samat arvot molempiin. Joudut myös muuttamaan käyttäjän antaman luvun asteikolle 0-65535. Yritä osata
Saisinko saman suomeksi? En ole ehtinyt vielä perehtyä näihin eri bittisysteemeihin, koska tähän mennessä kaikki on onnistunut helpommalla. Jos käyttäjä syöttää luvun asteikolta 0-65535, niin miten tämä muutetaan siten että ääni tulee molemmista kaiuttimista yhtä lujaa? Mitä ylläolevat funktiot tekevät?
Jos käyttäjä antaa luvun ko. asteikolta, voiko sen muuttaa jollain valmiilla funktiolla oikeaan muotoon (arvelen, että ylempänä olevat tekevät sen, jos osaisi käyttää)?
Macro kirjoitti:
En ole ehtinyt vielä perehtyä näihin eri bittisysteemeihin, koska tähän mennessä kaikki on onnistunut helpommalla.
Nyt olisi siis hyvä syy perehtyä. Ei se niin vaikeaa ole, ja osaamisesta hyötyy myöhemminkin.
Itsellekin oli melko karseeta pelata bittitasolla, sillä viime kerrasta on aikaa. Tässä luokka, jossa äänensäätö on porrastettu 255:lle asteelle (koska jakolasku menee mukavasti tasan, ei tarvii castailla ja pyöristellä). Laitoin mukaan balanssinsäädön jos sattuu moista joku joskus tarvihteemaan.
Linkki alla.
Lähetin päivitetyn version koodivinkiksi: Äänenvoimakkuuden säätö Windowsissa (Python). Sisältää nyt myös mahdollisuudet oman porrastuksen määrittelyyn, balanssin säätämiseen äänenvoimakkuuteen vaikuttamatta sekä alkuperäisen äänenvoimakkuuden palauttamiseen. Esimerkeissä juurikin kysytty 0-100 porrastus. Toimii tällä kertaa Pythonin kolmosversiolla.
Eikö koodivinkeissä voi käyttää Python-väritystä?
Macro kirjoitti:
Eikö koodivinkeissä voi käyttää Python-väritystä?
Voi, jos kirjoittaa koodinsa normaaleihin kooditageihin eikä alempiin koodilistauslaatikoihin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.