Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python ja Windows äänenvoimakkuus

Sivun loppuun

Macro [19.06.2010 11:02:45]

#

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.

Sharph [19.06.2010 13:23:26]

#

Pikagooglailulla löysin tuommoisen softan: http://www.nirsoft.net/utils/nircmd.html jolla voi siis komentoriviltä muuttaa esim. sitä äänenvoimakkuutta.

Macro [20.06.2010 10:15:59]

#

Tarkoitus olisi ollut tehdä ilman mitään erillisiä ohjelmia.

Deffi [20.06.2010 16:51:56]

#

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?

tsuriga [20.06.2010 17:03:04]

#

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

Deffi [20.06.2010 17:15:00]

#

Öö, 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)

tsuriga [20.06.2010 17:17:30]

#

Varmaan auttas jos muistas jotain bittien pyörittelystä :). Juu, arvailin just saman kasaan,

vol = c_ulong((volume & 0x0000FFFF) + (volume << 16))

Macro [20.06.2010 17:44:52]

#

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?

tsuriga [20.06.2010 17:52:14]

#

Pieni lapsus, waveOutSetVolume(0, vol). Alkuun [t]import ctypes.

Macro [20.06.2010 18:08:26]

#

Eli siis millaisessa muodossa äänenvoimmakkuus pitäisi antaa? Käyttäjä antaa äänenvoimmakkuuden 0-100, miten se pitäisi muuttaa tuohon kummalliseen formaattiin?

Deffi [20.06.2010 20:27:08]

#

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

Macro [20.06.2010 20:53:45]

#

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ää)?

Chiman [20.06.2010 21:07:22]

#

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.

tsuriga [20.06.2010 21:27:51]

#

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.

tsuriga [21.06.2010 21:53:02]

#

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.

Macro [21.06.2010 22:38:13]

#

Eikö koodivinkeissä voi käyttää Python-väritystä?

Metabolix [21.06.2010 22:54:38]

#

Macro kirjoitti:

Eikö koodivinkeissä voi käyttää Python-väritystä?

Voi, jos kirjoittaa koodinsa normaaleihin kooditageihin eikä alempiin koodilistauslaatikoihin.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta