SetSocketMediaStreamingMode
関数シグネチャ
// Windows.Networking.dll
#include <windows.h>
HRESULT SetSocketMediaStreamingMode(
BOOL value
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| value | BOOL | in | ネットワークが、quality of service を必要とするストリーミング メディアの転送に使用されるかどうかを示します。これにより、低遅延として開かれたソケットが、802.11 ワイヤレス ネットワーク上で適切な quality of service を得られるようになります。 |
戻り値の型: HRESULT
公式ドキュメント
ネットワークが、quality of service を必要とするストリーミング メディアの転送に使用されるかどうかを示します。
戻り値
エラーが発生しなかった場合、 SetSocketMediaStreamingMode は S_OK を返します。それ以外の場合は、HRESULT としてエラー コードが返されます。
解説(Remarks)
SetSocketMediaStreamingMode 関数は、ネットワークが quality of service を必要とするストリーミング メディアの転送に使用されるかどうかを示すために使用します。この関数は通常、一貫した quality of service を必要とする Voice over IP (VoIP) や類似のアプリで使用されます。SetSocketMediaStreamingMode 関数は、Windows ストア アプリまたはデスクトップ アプリで使用できます。
メディア ストリーミングを 802.11 ワイヤレス ネットワーク上で使用する場合、quality of service の問題が発生することがあります。802.11 ネットワーク ドライバーは、近隣の他のインフラストラクチャ ネットワーク (ESS) やアドホック ネットワーク (IBSS) を定期的にスキャンします。これにより、ワイヤレス ネットワーク アダプターは他のネットワークを見つけ、より強い信号を持つネットワークに接続できる可能性があります。現在のほとんどの 802.11 ネットワーク ドライバーは、利用可能なすべてのチャネルを一連の処理として一度にスキャンします。802.11 ネットワーク ドライバーが他のネットワークをスキャンして別のチャネルを待ち受けている間は、アプリのパケットを受信できません。他のネットワークをスキャンするのに費やされる時間により、VoIP アプリがオーディオ ストリームを受信できない、知覚できる程度の中断 (100 ミリ秒以上) が生じることがあります。このスキャン処理は、デュアル バンド (2.4GHz と 5GHz) の 802.11 ネットワーク アダプターではさらに多くのチャネルがスキャンされるため、より長くなります。その結果、オーディオが途切れているように知覚されることがあります。
SetSocketMediaStreamingMode 関数が value パラメーターを TRUE に設定して呼び出され、そのソケットが 802.11 ワイヤレス ネットワーク アダプター経由で転送を行う場合、システムはワイヤレス ネットワーク ドライバーに対して他のネットワークのスキャンを停止するよう通知します。これにより、802.11 ワイヤレス ネットワーク上で使用される VoIP や類似のオーディオ アプリの途切れがなくなりますが、同時にローカル コンピューターまたはデバイス上で実行されているすべてのアプリにも影響します。
スキャンをオフにすると問題が生じる場合があります。スキャンが無効になっていると、ユーザーがネットワークから遠ざかって信号がますます弱くなっても、ローカル コンピューターは同じネットワークに接続したままになります。
VoIP や類似のアプリは、802.11 ワイヤレス ネットワーク ドライバーのメディア ストリーミング モードを復元するために、すべての低遅延ソケットを閉じる必要があります。これにより、他のワイヤレス ネットワークのスキャンが再び有効になります。
SetSocketMediaStreamingMode 関数は、ソケットが 802.11 ワイヤレス アダプター経由でパケットを送受信しない場合には効果がありません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// Windows.Networking.dll
#include <windows.h>
HRESULT SetSocketMediaStreamingMode(
BOOL value
);[DllImport("Windows.Networking.dll", ExactSpelling = true)]
static extern int SetSocketMediaStreamingMode(
bool value // BOOL
);<DllImport("Windows.Networking.dll", ExactSpelling:=True)>
Public Shared Function SetSocketMediaStreamingMode(
value As Boolean ' BOOL
) As Integer
End Function' value : BOOL
Declare PtrSafe Function SetSocketMediaStreamingMode Lib "windows.networking" ( _
ByVal value As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
SetSocketMediaStreamingMode = ctypes.windll.LoadLibrary("Windows.Networking.dll").SetSocketMediaStreamingMode
SetSocketMediaStreamingMode.restype = ctypes.c_int
SetSocketMediaStreamingMode.argtypes = [
wintypes.BOOL, # value : BOOL
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('Windows.Networking.dll')
SetSocketMediaStreamingMode = Fiddle::Function.new(
lib['SetSocketMediaStreamingMode'],
[
Fiddle::TYPE_INT, # value : BOOL
],
Fiddle::TYPE_INT)#[link(name = "windows.networking")]
extern "system" {
fn SetSocketMediaStreamingMode(
value: i32 // BOOL
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("Windows.Networking.dll")]
public static extern int SetSocketMediaStreamingMode(bool value);
"@
$api = Add-Type -MemberDefinition $sig -Name 'Windows.Networking_SetSocketMediaStreamingMode' -Namespace Win32 -PassThru
# $api::SetSocketMediaStreamingMode(value)#uselib "Windows.Networking.dll"
#func global SetSocketMediaStreamingMode "SetSocketMediaStreamingMode" sptr
; SetSocketMediaStreamingMode value ; 戻り値は stat
; value : BOOL -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "Windows.Networking.dll"
#cfunc global SetSocketMediaStreamingMode "SetSocketMediaStreamingMode" int
; res = SetSocketMediaStreamingMode(value)
; value : BOOL -> "int"; HRESULT SetSocketMediaStreamingMode(BOOL value)
#uselib "Windows.Networking.dll"
#cfunc global SetSocketMediaStreamingMode "SetSocketMediaStreamingMode" int
; res = SetSocketMediaStreamingMode(value)
; value : BOOL -> "int"import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
windows_networking = windows.NewLazySystemDLL("Windows.Networking.dll")
procSetSocketMediaStreamingMode = windows_networking.NewProc("SetSocketMediaStreamingMode")
)
// value (BOOL)
r1, _, err := procSetSocketMediaStreamingMode.Call(
uintptr(value),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // HRESULTfunction SetSocketMediaStreamingMode(
value: BOOL // BOOL
): Integer; stdcall;
external 'Windows.Networking.dll' name 'SetSocketMediaStreamingMode';result := DllCall("Windows.Networking\SetSocketMediaStreamingMode"
, "Int", value ; BOOL
, "Int") ; return: HRESULT●SetSocketMediaStreamingMode(value) = DLL("Windows.Networking.dll", "int SetSocketMediaStreamingMode(bool)")
# 呼び出し: SetSocketMediaStreamingMode(value)
# value : BOOL -> "bool"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "windows.networking" fn SetSocketMediaStreamingMode(
value: i32 // BOOL
) callconv(std.os.windows.WINAPI) i32;proc SetSocketMediaStreamingMode(
value: int32 # BOOL
): int32 {.importc: "SetSocketMediaStreamingMode", stdcall, dynlib: "Windows.Networking.dll".}pragma(lib, "windows.networking");
extern(Windows)
int SetSocketMediaStreamingMode(
int value // BOOL
);ccall((:SetSocketMediaStreamingMode, "Windows.Networking.dll"), stdcall, Int32,
(Int32,),
value)
# value : BOOL -> Int32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t SetSocketMediaStreamingMode(
int32_t value);
]]
local windows.networking = ffi.load("windows.networking")
-- windows.networking.SetSocketMediaStreamingMode(value)
-- value : BOOL
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('Windows.Networking.dll');
const SetSocketMediaStreamingMode = lib.func('__stdcall', 'SetSocketMediaStreamingMode', 'int32_t', ['int32_t']);
// SetSocketMediaStreamingMode(value)
// value : BOOL -> 'int32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("Windows.Networking.dll", {
SetSocketMediaStreamingMode: { parameters: ["i32"], result: "i32" },
});
// lib.symbols.SetSocketMediaStreamingMode(value)
// value : BOOL -> "i32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t SetSocketMediaStreamingMode(
int32_t value);
C, "Windows.Networking.dll");
// $ffi->SetSocketMediaStreamingMode(value);
// value : BOOL
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Windows.networking extends StdCallLibrary {
Windows.networking INSTANCE = Native.load("windows.networking", Windows.networking.class);
int SetSocketMediaStreamingMode(
boolean value // BOOL
);
}@[Link("windows.networking")]
lib LibWindows.Networking
fun SetSocketMediaStreamingMode = SetSocketMediaStreamingMode(
value : Int32 # BOOL
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef SetSocketMediaStreamingModeNative = Int32 Function(Int32);
typedef SetSocketMediaStreamingModeDart = int Function(int);
final SetSocketMediaStreamingMode = DynamicLibrary.open('Windows.Networking.dll')
.lookupFunction<SetSocketMediaStreamingModeNative, SetSocketMediaStreamingModeDart>('SetSocketMediaStreamingMode');
// value : BOOL -> Int32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function SetSocketMediaStreamingMode(
value: BOOL // BOOL
): Integer; stdcall;
external 'Windows.Networking.dll' name 'SetSocketMediaStreamingMode';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "SetSocketMediaStreamingMode"
c_SetSocketMediaStreamingMode :: CInt -> IO Int32
-- value : BOOL -> CInt
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let setsocketmediastreamingmode =
foreign "SetSocketMediaStreamingMode"
(int32_t @-> returning int32_t)
(* value : BOOL -> int32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library windows.networking (t "Windows.Networking.dll"))
(cffi:use-foreign-library windows.networking)
(cffi:defcfun ("SetSocketMediaStreamingMode" set-socket-media-streaming-mode :convention :stdcall) :int32
(value :int32)) ; BOOL
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $SetSocketMediaStreamingMode = Win32::API::More->new('Windows.Networking',
'int SetSocketMediaStreamingMode(BOOL value)');
# my $ret = $SetSocketMediaStreamingMode->Call($value);
# value : BOOL -> BOOL
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。