Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [vb6] alcune delucidazioni

    Salve,

    Prima di iniziare a postare codice e a parlare della winmm.dll e dei metodi waveInxxx
    avrei qualche domanda in generale su come viene gestito l'audio su windows.

    Che cos'è un device?

    Una scheda audio o un dispositivo hardware esterno qualunque?
    Ad esempio quando attacco lo spinotto esterno del mic come faccio a vederlo?

    che cos'è una soundcard?

    come spieghero dopo nel codice io ottengo come device "sb200" che credo
    che stia per "sound blaster" .. che cos'è?

    viene rappresentata dal quel mixer nell'applicazione "multimedia" nel pannello di controllo?

    questa era la confusione che avevo al riguardo (in quanto newbie del mondo win come di vb)

    Ora avrei alcune domande sui metodi waveInxxx della winmm:

    --> waveInGetNumDevs
    Ritorna il numero dei "dispositivi" waveIn disponibili

    cosa vuol dire "dispositivi" in questo caso? una scheda audio o il mic esterno?

    [vb]
    Private Type WaveInCaps
    ManufacturerID As Integer
    ProductID As Integer
    DriverVersion As Long
    ProductName(1 To 32) As Byte
    Formats As Long
    Channels As Integer
    Reserved As Integer
    End Type

    Private Declare Function waveInGetNumDevs Lib "winmm" () As Long
    Private Declare Function waveInGetDevCaps Lib "winmm" Alias "waveInGetDevCapsA" (ByVal uDeviceID As Long, Byval lpCaps As Long, ByVal uSize As Long) As Long

    sub InitDevices()

    Dim Caps As WaveInCaps, Which As Long, testo As String

    For Which = 0 To waveInGetNumDevs - 1
    Call waveInGetDevCaps(Which, VarPtr(Caps), Len(Caps))
    testo = StrConv(Caps.ProductName, vbUnicode) & Which
    msgbox testo
    Next

    If Which = 0 Then
    MsgBox "You have no audio input devices!", vbCritical, "Ack!"
    End
    End If

    End Sub
    [/vb]

    eseguendo questo codice ottengo SB200 che dovrebbe essere un valido waveIn ...
    cos'altro avrei potuto ottenere? waveInGetNumDevs può essere maggiore di 1?

    Ora vi posto tutto il codice che ho messo insieme finora per catturare l'audio da mic esterno
    anche se ancora non so come e in quale variabile (o descrittore) va a finire l'audio...

    [vb]
    '
    ' waveInGetNumDevs(): Determines the number of audio drivers available for input.
    ' waveInOpen(): Creates an instance of the specified audio device for input.
    ' waveInPrepareHeader(): Prepares a WAVEHDR and data block for input.
    ' waveInUnprepareHeader(): Releases a previously prepared WAVEHDR and data block.
    ' waveInClose(): Closes the specified instance of the audio device.
    ' waveInReset(): Stops recording and empties the queue.
    ' waveInStart(): Starts recording to the queued buffer.
    ' waveInStop(): Stops recording.
    ' waveInAddBuffer(): Adds a prepared buffer to the record queue.
    ' waveInGetDevCaps(): Gets the capabilities of the specified device
    '
    ' WAVEINCAPS: Describes the capabilities of an input device.
    '

    Option Explicit

    Private DevHandle As Long
    Private InData(0 To 511) As Byte

    Private Type WaveFormatEx
    FormatTag As Integer
    Channels As Integer
    SamplesPerSec As Long
    AvgBytesPerSec As Long
    BlockAlign As Integer
    BitsPerSample As Integer
    ExtraDataSize As Integer
    End Type

    Private Type WaveHdr
    lpData As Long
    dwBufferLength As Long
    dwBytesRecorded As Long
    dwUser As Long
    dwFlags As Long
    dwLoops As Long
    lpNext As Long
    Reserved As Long
    End Type

    Private Type WaveInCaps
    ManufacturerID As Integer
    ProductID As Integer
    DriverVersion As Long
    ProductName(1 To 32) As Byte
    Formats As Long
    Channels As Integer
    Reserved As Integer
    End Type

    Private Const WAVE_FORMAT_4M16 = &H400& '/* 44.1 kHz, Mono, 6-bit
    Private Const WAVE_FORMAT_PCM = 1

    Private Declare Function waveInGetNumDevs Lib "winmm" () As Long
    Private Declare Function waveInGetDevCaps Lib "winmm" Alias "waveInGetDevCapsA" (ByVal uDeviceID As Long, Byval lpCaps As Long, ByVal uSize As Long) As Long
    Private Declare Function waveInAddBuffer Lib "winmm" (ByVal InputDeviceHandle As Long, ByVal WaveHdrPointer As Long, ByVal WaveHdrStructSize As Long) As Long
    Private Declare Function waveInPrepareHeader Lib "winmm" (ByVal InputDeviceHandle As Long, ByVal WaveHdrPointer As Long, ByVal WaveHdrStructSize As Long) As Long
    Private Declare Function waveInUnprepareHeader Lib "winmm" (ByVal InputDeviceHandle As Long, ByVal WaveHdrPointer As Long, ByVal WaveHdrStructSize As Long) As Long
    Private Declare Function waveInOpen Lib "winmm" (WaveDeviceInputHandle As Long, ByVal WhichDevice As Long, ByVal WaveFormatExPointer As Long, ByVal CallBack As Long, ByVal CallBackInstance As Long, ByVal Flags As Long) As Long
    Private Declare Function waveInClose Lib "winmm" (ByVal WaveDeviceInputHandle As Long) As Long
    Private Declare Function waveInStart Lib "winmm" (ByVal WaveDeviceInputHandle As Long) As Long
    Private Declare Function waveInReset Lib "winmm" (ByVal WaveDeviceInputHandle As Long) As Long
    Private Declare Function waveInStop Lib "winmm" (ByVal WaveDeviceInputHandle As Long) As Long

    sub InitDevices()

    Dim Caps As WaveInCaps, Which As Long, testo As String

    For Which = 0 To waveInGetNumDevs - 1
    Call waveInGetDevCaps(Which, VarPtr(Caps), Len(Caps))
    testo = StrConv(Caps.ProductName, vbUnicode) & Which
    msgbox testo
    Next

    If Which = 0 Then
    MsgBox "You have no audio input devices!", vbCritical, "Ack!"
    End
    End If

    End Sub

    Private Sub Form_Load()
    Call InitDevices
    End Sub

    Private Sub StartButton_Click()

    Static WaveFormat As WaveFormatEx

    With WaveFormat
    .FormatTag = WAVE_FORMAT_PCM
    .Channels = 2
    .SamplesPerSec = 44100
    .BitsPerSample = 8
    .BlockAlign = (.Channels * .BitsPerSample) \ 8
    .AvgBytesPerSec = .BlockAlign * .SamplesPerSec
    .ExtraDataSize = 0
    End With

    Debug.Print "waveInOpen:"; waveInOpen(DevHandle, 0, VarPtr(WaveFormat), 0, 0, 0)

    If DevHandle = 0 Then
    Call MsgBox("Wave input device didn't open!", vbExclamation, "Ack!")
    Exit Sub
    End If

    Debug.Print " "; DevHandle
    Call waveInStart(DevHandle)

    Static Wave As WaveHdr

    Wave.lpData = VarPtr(InData(0))
    Wave.dwBufferLength = 512 'This is now 512 so there's still 256 samples per channel
    Wave.dwFlags = 0

    '
    ' Call waveInPrepareHeader(DevHandle, VarPtr(Wave), Len(Wave))
    ' Call waveInAddBuffer(DevHandle, VarPtr(Wave), Len(Wave))
    '
    ' Arrivati a questo punto come prendo l'output dal microfono
    ' per poi redirigerlo ad una convertitore MP3
    ' o ad un Socket che lo trasmette ad un Client
    ' o per salvarlo su file ???
    '
    ' Call waveInUnprepareHeader(DevHandle, VarPtr(Wave), Len(Wave))
    '

    End Sub

    Private Sub StopButton_Click()

    Call waveInReset(DevHandle)
    Call waveInClose(DevHandle)
    DevHandle = 0

    End Sub
    [/vb]

    Come ottengo fisicamente l'audio?
    Se volessi salvarlo o redirigerlo ad un Socket di tipo server?
    (o magari comprimerlo in MP3?)

    Grazie a tutti!

  2. #2

    bo

    con mcisendstring, sempre usando winmm.dll, non si fa prima?

    <code>
    suono = mcisendstring("save miosuono " & cd.filename, 0 ,0 ,0)
    </code>

    una volta salvato lo comprimi im mp3...

    Se non ho capito male il problema è nel salvare l'audio e quindi ottenerlo fisicamente...
    Ho analogo problema:all'atto di salvare il file l'api non scrive su hd
    Se tu hai risolto sarei felice di sapere come.
    Ciao e grazie

  3. #3
    ma come l'hai ripescata questa discussione??

    cmq ho lasciato perdere 10 mesi fa... (dicono che in visual c si fa in un attimo)

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465

    Moderazione

    Originariamente inviato da riccater
    Se tu hai risolto sarei felice di sapere come.
    Non ripristiniamo discussioni già chiuse e "morte" da tempo, per favore.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.