質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

985閲覧

Win32APIのwaveOutGetVolume関数の呼び出し方法について

ujex256

総合スコア5

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/01/19 12:10

前提

PythonでWin32APIを呼び出してデバイスの音量を取得したいです。
waveOutVolumeGet関数を呼び出して取得したいです。
デバイスのハンドルの取得はできていて、エラーも発生しなかったので問題ないと思うのですが、
結果が0しか返ってきませんでした。

ソースコード

Python

1import ctypes 2from ctypes import wintypes 3 4 5CALLBACK_NULL = 0x0000_0000 6 7class WAVEFORMATEX(ctypes.Structure): 8 _fields_ = [("wFormatTag", wintypes.WORD), 9 ("nChannels", wintypes.WORD), 10 ("nSamplesPerSec", wintypes.DWORD), 11 ("nAvgBytesPerSec", wintypes.DWORD), 12 ("nBlockAlign", wintypes.WORD), 13 ("wBitsPerSample", wintypes.WORD), 14 ("cbSize", wintypes.WORD)] 15 16 17def get_volume() -> int: 18 wave_format = WAVEFORMATEX() 19 wave_format.wFormatTag = 1 # WAVE_FORMAT_PCM 20 wave_format.nChannels = 2 21 wave_format.nSamplesPerSec = 44100 22 wave_format.nAvgBytesPerSec = 176400 23 wave_format.nBlockAlign = 4 24 wave_format.wBitsPerSample = 16 25 wave_format.cbSize = 0 26 27 winmm = ctypes.windll.winmm 28 waveOutOpen = winmm.waveOutOpen 29 waveOutOpen.argtypes = [wintypes.HANDLE, wintypes.UINT, WAVEFORMATEX, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint] 30 waveOutOpen.restype = ctypes.c_uint 31 32 device_handle = wintypes.HANDLE() 33 open_result = waveOutOpen(ctypes.byref(device_handle), wintypes.UINT(-1), wave_format, 0, 0, CALLBACK_NULL) 34 35 print("waveOutOpen errorCode", open_result) 36 print("outputDevice", device_handle) 37 38 vol = ctypes.c_uint() # この変数のポインタを指定して関数を実行 39 get_vol = winmm.waveOutGetVolume(device_handle, ctypes.byref(vol)) 40 print("waveOutGetVolume errorCode", get_vol) 41 return vol.value 42 43a = get_volume() 44print("\nresult", a)

試したこと

waveOutOpen関数の第二引数を違う値に変更

補足情報(FW/ツールのバージョンなど)

  • Windows11 バージョン22H2
  • Python 3.10.7

参考にしたドキュメント

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

waveOutOpen関数の3つ目の引数が、WAVEFORMATEX型のポインターになっていなかったり、volの型がctypes.c_ulong()またはwintypes.DWORD()になっていなかったりしていますが、私の環境では取得できました。

結果が0であるということは、音量が0である可能性があります。
waveOutOpen関数でデバイスを開いた状態(time.sleep関数を使うなどで開いた状態を保持する)で、通知領域のスピーカーアイコンを右クリックし「音量ミキサーを開く(M)」を選択して表示される音量ミキサーで、Pythonの音量が0でないか確認すると良いと思います。

Python

1import ctypes 2from ctypes import wintypes 3 4CALLBACK_NULL = 0x0000_0000 5 6class WAVEFORMATEX(ctypes.Structure): 7 _fields_ = [("wFormatTag", wintypes.WORD), 8 ("nChannels", wintypes.WORD), 9 ("nSamplesPerSec", wintypes.DWORD), 10 ("nAvgBytesPerSec", wintypes.DWORD), 11 ("nBlockAlign", wintypes.WORD), 12 ("wBitsPerSample", wintypes.WORD), 13 ("cbSize", wintypes.WORD)] 14 15def main(): 16 wave_format = WAVEFORMATEX() 17 wave_format.wFormatTag = 1 # WAVE_FORMAT_PCM 18 wave_format.nChannels = 2 19 wave_format.nSamplesPerSec = 44100 20 wave_format.nAvgBytesPerSec = 176400 21 wave_format.nBlockAlign = 4 22 wave_format.wBitsPerSample = 16 23 wave_format.cbSize = 0 24 25 winmm = ctypes.windll.winmm 26 waveOutOpen = winmm.waveOutOpen 27 28 device_handle = wintypes.HANDLE() 29 open_result = waveOutOpen(ctypes.byref(device_handle), wintypes.UINT(-1), ctypes.byref(wave_format), 0, 0, CALLBACK_NULL) 30 print("waveOutOpen errorCode", open_result) 31 32 33 # import time 34 # time.sleep(30) 35 36 vol = wintypes.DWORD() 37 get_vol = winmm.waveOutGetVolume(device_handle, ctypes.byref(vol)) 38 print("waveOutGetVolume errorCode", get_vol) 39 40 winmm.waveOutClose(device_handle) 41 42 print(f"\nresult : {vol.value:08X}") 43 print(f"左チャネル : {vol.value&0xffff:04X}") 44 print(f"右チャネル : {vol.value>>16:04X}") 45 46main()

実行結果

waveOutOpen errorCode 0
waveOutGetVolume errorCode 0

result : 0000FFFF
左チャネル : FFFF
右チャネル : 0000

投稿2023/01/19 21:03

編集2023/01/19 21:15
dtn8kp6s

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ujex256

2023/01/21 02:14

ありがとうございます! 確認してみたところご指摘のとおりPythonの音量が0になっていました。 ですが音量を変えても変わらなかったので、そもそも音が出るかPygameなどのモジュールを使って確認してみたところ音が出ませんでした。どうやらこちらの環境に問題がありそうなので試行錯誤してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問