none
Controle de Volume do Som

Answers

  • Olá Gutenberg,

    A minha primeira idéia foi usar o WMI, mas aparentemente isto não é possível, então baseado num artigo que eu encontrei na net eu montei uma classe em C# que acessa diretamente a Win32 pra obter e alterar o volume:

    public class WaveVolume {

    [DllImport("winmm.dll")]

    public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume);

    [DllImport("winmm.dll")]

    public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);

    static public Single Volume {

    get {

    uint volume;

    waveOutGetVolume(IntPtr.Zero, out volume);

    return (float)(volume & 0xffff) / ushort.MaxValue;

    }

    set {

    if (value < 0 || value > 1) {

    throw new ArgumentOutOfRangeException("value", "O valor deve estar entre 0 e 1.");

    }

    uint volume = (uint)(value * ushort.MaxValue);

    volume = volume | (volume << 16);

    waveOutSetVolume(IntPtr.Zero, volume);

    }

    }

    }

    Fica faltando a parte remota, mas isto vai depender do que você tem na máquina remota: Sistema operacional, se tem IIS ou não, versão do .NET Framwork (1.x, 2.0 ou 3.0?), se tem firewall no meio do caminho, etc.

    Passe estas informações que eu vou ver o que dá pra fazer.

    []

     

    Thursday, August 24, 2006 7:03 PM
  • Olá Gutenberg,

    Nos testes que eu fiz aqui ontem, eu rodei a rotina localmente e tudo pareceu funcionar corretamente.

    Eu digo "pareceu" porque eu estava escutando uns MP3 e consegui alterar o volume com sucesso. Acontece que MP3 sai pela linha Wave e a rotina altera só a linha Wave.

    Provavelmente isto não é o suficiente para você, então eu fui atrás de uma rotina que manipulasse a linha Speaker, que é a linha principal.

    Acabei encontrando uma rotina em VB.NET em http://blogs.vbcity.com/drydo/archive/2005/06/07/2038.aspx

    Para rodar remotamente, eu sugiro instanciar a classe e manipulá-lo num Web Service.

    []

    Saturday, August 26, 2006 3:16 PM
  • Olá Gutenberg,

    Crie um projeto ASP.NET Web Service, adicione a classe mencinada em meu post anterior e faça com que o Web Service a utilize. No Visual Studio 2005 ficaria mais ou menos assim:

    Imports System.Web

    Imports System.Web.Services

    Imports System.Web.Services.Protocols

    <WebService(Namespace:="http://tempuri.org/")> _

    <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _

    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _

    Public Class WebService

    Inherits System.Web.Services.WebService

    <WebMethod()> _

    Public Sub SetVolume(ByVal level As Integer)

    Dim s As New Sound() 'Instancia o objeto Sound

    s.SetVolume(level) 'Altera o volume

    End Sub

    End Class

    []

    Wednesday, August 30, 2006 2:26 PM

All replies

  • Olá Gutenberg,

    A minha primeira idéia foi usar o WMI, mas aparentemente isto não é possível, então baseado num artigo que eu encontrei na net eu montei uma classe em C# que acessa diretamente a Win32 pra obter e alterar o volume:

    public class WaveVolume {

    [DllImport("winmm.dll")]

    public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume);

    [DllImport("winmm.dll")]

    public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);

    static public Single Volume {

    get {

    uint volume;

    waveOutGetVolume(IntPtr.Zero, out volume);

    return (float)(volume & 0xffff) / ushort.MaxValue;

    }

    set {

    if (value < 0 || value > 1) {

    throw new ArgumentOutOfRangeException("value", "O valor deve estar entre 0 e 1.");

    }

    uint volume = (uint)(value * ushort.MaxValue);

    volume = volume | (volume << 16);

    waveOutSetVolume(IntPtr.Zero, volume);

    }

    }

    }

    Fica faltando a parte remota, mas isto vai depender do que você tem na máquina remota: Sistema operacional, se tem IIS ou não, versão do .NET Framwork (1.x, 2.0 ou 3.0?), se tem firewall no meio do caminho, etc.

    Passe estas informações que eu vou ver o que dá pra fazer.

    []

     

    Thursday, August 24, 2006 7:03 PM
  • Alfred Myers obrigado pela ajuda... Como eu ainda não instalei o C# em minha máquina gostaria de saber como posso testar, se vai ser preciso instalar ou se tem como eu converter prá VB2005 express. Qto ao SO é XP sp2, framework 2.0 e firewall do windows(mas se for preciso fica desativado)... quero resolver da maneira mais fácil, pq informo para o cliente as condições que pode ser feito e deixo a decisão por conta dele...
    Saturday, August 26, 2006 12:06 PM
  • Olá Gutenberg,

    Nos testes que eu fiz aqui ontem, eu rodei a rotina localmente e tudo pareceu funcionar corretamente.

    Eu digo "pareceu" porque eu estava escutando uns MP3 e consegui alterar o volume com sucesso. Acontece que MP3 sai pela linha Wave e a rotina altera só a linha Wave.

    Provavelmente isto não é o suficiente para você, então eu fui atrás de uma rotina que manipulasse a linha Speaker, que é a linha principal.

    Acabei encontrando uma rotina em VB.NET em http://blogs.vbcity.com/drydo/archive/2005/06/07/2038.aspx

    Para rodar remotamente, eu sugiro instanciar a classe e manipulá-lo num Web Service.

    []

    Saturday, August 26, 2006 3:16 PM
  • Oi Alfred Myers, a rotina testei localmente e funcionou beleza, não testei remotamente pq não manjo nada de WEB SERVICE, não sei se muda alguma coisa, mas eu quero utilizar em uma rede local... assim mesmo obrigado mais uma vez
    Tuesday, August 29, 2006 3:05 AM
  • Olá Gutenberg,

    Crie um projeto ASP.NET Web Service, adicione a classe mencinada em meu post anterior e faça com que o Web Service a utilize. No Visual Studio 2005 ficaria mais ou menos assim:

    Imports System.Web

    Imports System.Web.Services

    Imports System.Web.Services.Protocols

    <WebService(Namespace:="http://tempuri.org/")> _

    <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _

    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _

    Public Class WebService

    Inherits System.Web.Services.WebService

    <WebMethod()> _

    Public Sub SetVolume(ByVal level As Integer)

    Dim s As New Sound() 'Instancia o objeto Sound

    s.SetVolume(level) 'Altera o volume

    End Sub

    End Class

    []

    Wednesday, August 30, 2006 2:26 PM