Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Dispositivo de audio

Estas en el tema de Dispositivo de audio en el foro de C/C++ en Foros del Web. Hola estoy intentando capturar desde el microfono de la placa de sonido con C++. Pero tengo un problemita que no entiendo que puede ser. Pego ...
  #1 (permalink)  
Antiguo 18/08/2007, 12:29
 
Fecha de Ingreso: agosto-2007
Mensajes: 6
Antigüedad: 16 años, 9 meses
Puntos: 0
Dispositivo de audio

Hola estoy intentando capturar desde el microfono de la placa de sonido con C++.
Pero tengo un problemita que no entiendo que puede ser.

Pego codigo aca:

MAIN.C
Código:
#include <stdlib.h>
#include <iostream>
#include "windows.h"
#include "mmsystem.h"
#include <msacm.h>
#include "function.h"
#pragma comment(lib, "libwinmm.a")

using namespace std;

int main()
{
	HWAVEIN hWaveIn;
	MMRESULT i;
	WAVEFORMATEX waveform;

    //open waveform audio for input
    waveform.wFormatTag = WAVE_FORMAT_PCM;
    waveform.nChannels = 1;
    waveform.nSamplesPerSec = 8000;
    waveform.wBitsPerSample = 16;
    waveform.cbSize = 0;
    waveform.nBlockAlign  = (waveform.nChannels * waveform.wBitsPerSample)/8;
    waveform.nAvgBytesPerSec = (waveform.nSamplesPerSec*waveform.nBlockAlign);

    i = waveInOpen(&hWaveIn, WAVE_MAPPER, &waveform, (DWORD)waveInFunc, 0, CALLBACK_FUNCTION);

    switch(i){
        case MMSYSERR_ALLOCATED:
            cout << "Error: MMSYSERR_ALLOCATED\n";
        break;

        case MMSYSERR_BADDEVICEID:
            cout << "Error: MMSYSERR_BADDEVICEID\n";
        break;

        case MMSYSERR_NODRIVER:
            cout << "Error: MMSYSERR_NODRIVER\n";
        break;

        case MMSYSERR_NOMEM:
            cout << "Error: MMSYSERR_NOMEM\n";
        break;

        case WAVERR_BADFORMAT:
            cout << "Error: WAVERR_BADFORMAT\n";
        break;

        case MMSYSERR_NOERROR:
            cout << "Error: MMSYSERR_NOERROR\n";
        break;

        default:
            cout << "Error desconocido\n";
    }

	cout << "Todo joia!" << std::endl;
	return 0;
}
FUNCTION.C
Código:
#include <stdlib.h>
#include "function.h"

void CALLBACK waveInFunc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2){

}
FUNCTION.H
Código:
#include "windows.h"

void CALLBACK waveInFunc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
cuando lo compilo me tira esto:

Código:
undefined reference to `_Z10waveInFuncP9HWAVEIN__jmmm@20'
No entiendo, alguna sugerencia?

saludos
  #2 (permalink)  
Antiguo 18/08/2007, 13:05
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Dispositivo de audio

¿Que compilador estas usando? ¿Estas seguro de que estas compilando tambien function.c? Eso mas bien parece un error al enlazar, no encuentra la funcion a la que hace referencia.

Por cierto es mejor ponerle extension .CPP a lo que sea de C++ y no .C que se usa, valga la redundancia, para C.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 18/08/2007, 16:27
 
Fecha de Ingreso: agosto-2007
Mensajes: 6
Antigüedad: 16 años, 9 meses
Puntos: 0
Re: Dispositivo de audio

Perdon, pero en el POST puse .C en los archivos de mi maquina estan en .CPP

El compilador es el codeblocks, es un IDE de programacion de C++.

Tendre que compilarlo a mano? ahora pruebo y cualquier cosa si funciona a mano lo comento.

gracias
  #4 (permalink)  
Antiguo 19/08/2007, 02:37
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Dispositivo de audio

Yo con unas minimas modificaciones puedo compilarlo con VC++, siempre que le pase los dos archivos de codigo fuente sino obtengo un error parecido al tuyo (en el enlazado) ya que la funcion esta declarada y no existe si no se compila function tambien.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 20/08/2007, 10:50
 
Fecha de Ingreso: agosto-2007
Mensajes: 6
Antigüedad: 16 años, 9 meses
Puntos: 0
Re: Dispositivo de audio

Cuales son los cambios que probaste?
lo probe tambien en compilarlo a mano pero sale el mismo error.

La linea de comendo que estoy probando es:

Código:
g++ main.cpp function.cpp  function.h -o test.
exe
D:\DOCUME~1\walter\CONFIG~1\Temp/ccKUaaaa.o(.text+0x1a6):main.cpp: undefined reference to `waveInOpen@24' 
collect2: ld returned 1 exit status
  #6 (permalink)  
Antiguo 20/08/2007, 11:18
 
Fecha de Ingreso: agosto-2007
Mensajes: 6
Antigüedad: 16 años, 9 meses
Puntos: 0
Re: Dispositivo de audio

Listo gente lo pude solucionar.

La solucion era poner en la primera linea esto:

Código:
#pragma comment (lib,"winmm.lib")
Ya que no se trata de un error del compilardor, sino un error de linkeo.
Ya que el compilador mira dentro de mmsystem.h y encuentra el encabezado de la funcion, pero no encuentra la implementacion de la misma, es por eso el error.

Gracias.

Última edición por walito07; 20/08/2007 a las 11:30
  #7 (permalink)  
Antiguo 20/08/2007, 11:56
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Dispositivo de audio

Ambos eran errores de enlazado como te dije al principio, el primero motivado por compilar un solo fuente (undefined reference to `_Z10waveInFuncP9HWAVEIN__jmmm@20') y el segundo por no usar la libreria de importacion necesaria (undefined reference to `waveInOpen@24'). Ese ultimo era por cierto uno de los cambios que habia hecho para generar el ejecutable en VC++.

Y es exactamente el mismo caso, el enlazador no puede resolver un simbolo, solo que en un uno busca el codigo en si mismo en el archivo objeto (funcion) y en el otro busca la importacion en la libreria (winmm).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #8 (permalink)  
Antiguo 14/06/2008, 13:22
 
Fecha de Ingreso: junio-2008
Mensajes: 5
Antigüedad: 15 años, 11 meses
Puntos: 0
Pregunta Respuesta: Dispositivo de audio

Hola tengo un problema similar, probé con lo del pragma pero me sigue dando el mismo error: undefined reference to '_waveInOpen@24' y similares

Este es el código

//#pragma comment (lib,"winmm.lib")

#include <iostream>
#include <windows.h>
#include <mmsystem.h>
using namespace std;

int main()
{


const int NUMPTS = 44100 * 10; // 10 seconds
int sampleRate = 44100;
short int waveIn[NUMPTS]; // 'short int' is a 16-bit type; I request 16-bit samples below
// for 8-bit capture, you'd use 'unsigned char' or 'BYTE' 8-bit types

HWAVEIN hWaveIn;
WAVEHDR WaveInHdr;
MMRESULT result;

// Specify recording parameters
WAVEFORMATEX pFormat;
pFormat.wFormatTag=WAVE_FORMAT_PCM; // simple, uncompressed format
pFormat.nChannels=1; // 1=mono, 2=stereo
pFormat.nSamplesPerSec=sampleRate; // 44100
pFormat.nAvgBytesPerSec=sampleRate*2; // = nSamplesPerSec * n.Channels * wBitsPerSample/8
pFormat.nBlockAlign=2; // = n.Channels * wBitsPerSample/8
pFormat.wBitsPerSample=16; // 16 for high quality, 8 for telephone-grade
pFormat.cbSize=0;

result = waveInOpen(&hWaveIn, WAVE_MAPPER,&pFormat,
0L, 0L, WAVE_FORMAT_DIRECT);
if (result)
{
char fault[256];
waveInGetErrorText(result, fault, 256);
cout<<"Failed to open waveform input device."<<endl;
// Application->MessageBox(fault, "Failed to open waveform input device.",
// MB_OK | MB_ICONEXCLAMATION);
return 0;
}

// Set up and prepare header for input
WaveInHdr.lpData = (LPSTR)waveIn;
WaveInHdr.dwBufferLength = NUMPTS*2;
WaveInHdr.dwBytesRecorded=0;
WaveInHdr.dwUser = 0L;
WaveInHdr.dwFlags = 0L;
WaveInHdr.dwLoops = 0L;
waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));

// Insert a wave input buffer
result = waveInAddBuffer(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
if (result)
{
cout<<"Failed to read block from device"<<endl;

//MessageBox(Application->Handle, "Failed to read block from device",
// NULL, MB_OK | MB_ICONEXCLAMATION);
return 1;
}


// Commence sampling input
result = waveInStart(hWaveIn);
if (result)
{
cout<<"Failed to start recording"<<endl;
//MessageBox(Application->Handle, "Failed to start recording",
// NULL, MB_OK | MB_ICONEXCLAMATION);
return 1;
}


// Wait until finished recording
do {} while (waveInUnprepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR))==WAVERR_STILLPLAYING);

waveInClose(hWaveIn);
cout << "Hello world!" << endl;
return 0;
}

lo que quiero es tomar el audio desde C++ a bajo nivel, y si es posible un código compatible para Linux.

1) mmsystem.h ¿anda en linux? ¿Que otra librería me recomiendan?

Muchas Gracias
  #9 (permalink)  
Antiguo 14/06/2008, 13:31
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Dispositivo de audio

¿Y si descomentas la linea del pragma? ...

Y no, mmsystem.h es de la API de Windows.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #10 (permalink)  
Antiguo 14/06/2008, 13:47
 
Fecha de Ingreso: junio-2008
Mensajes: 5
Antigüedad: 15 años, 11 meses
Puntos: 0
De acuerdo Respuesta: Dispositivo de audio

Osea, ya probé descomentandola y dan los mismos errores
Uso CodeBlock 8.02. Gracias por responder tan rápido :) ojalá me puedan ayudar. Gracias de nuevo :)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:16.