Compilador - Duvida basica

1. Compilador - Duvida basica

Diego
dmt23

(usa Ubuntu)

Enviado em 01/05/2015 - 20:38h

Ola,
Eu estou fazendo um projeto, em que tenho que captar e tratar os dados da entrada de som do computador, eu estou trabalhando com a biblioteca ALSA. Estou tendo problema em compilar o programa a seguir dentro de um programa tipo ANJUTA, consigo compilar somente no terminal.
/*

This example reads from the default PCM device
and writes to standard output for 5 seconds of data.

*/

/* Use the newer ALSA API */
#define ALSA_PCM_NEW_HW_PARAMS_API

#include <alsa/asoundlib.h>

int main() {
long loops;
int rc;
int size;
snd_pcm_t *handle;
snd_pcm_hw_params_t *params;
unsigned int val;
int dir;
snd_pcm_uframes_t frames;
char *buffer;

/* Open PCM device for recording (capture). */
rc = snd_pcm_open(&handle, "default",
SND_PCM_STREAM_CAPTURE, 0);
if (rc < 0) {
fprintf(stderr,
"unable to open pcm device: %s\n",
snd_strerror(rc));
exit(1);
}

/* Allocate a hardware parameters object. */
snd_pcm_hw_params_alloca(&params);

/* Fill it in with default values. */
snd_pcm_hw_params_any(handle, params);

/* Set the desired hardware parameters. */

/* Interleaved mode */
snd_pcm_hw_params_set_access(handle, params,
SND_PCM_ACCESS_RW_INTERLEAVED);

/* Signed 16-bit little-endian format */
snd_pcm_hw_params_set_format(handle, params,
SND_PCM_FORMAT_S16_LE);

/* Two channels (stereo) */
snd_pcm_hw_params_set_channels(handle, params, 2);

/* 44100 bits/second sampling rate (CD quality) */
val = 44100;
snd_pcm_hw_params_set_rate_near(handle, params,
&val, &dir);

/* Set period size to 32 frames. */
frames = 32;
snd_pcm_hw_params_set_period_size_near(handle,
params, &frames, &dir);

/* Write the parameters to the driver */
rc = snd_pcm_hw_params(handle, params);
if (rc < 0) {
fprintf(stderr,
"unable to set hw parameters: %s\n",
snd_strerror(rc));
exit(1);
}

/* Use a buffer large enough to hold one period */
snd_pcm_hw_params_get_period_size(params,
&frames, &dir);
size = frames * 4; /* 2 bytes/sample, 2 channels */
buffer = (char *) malloc(size);

/* We want to loop for 5 seconds */
snd_pcm_hw_params_get_period_time(params,
&val, &dir);
loops = 5000000 / val;

while (loops > 0) {
loops--;
rc = snd_pcm_readi(handle, buffer, frames);
if (rc == -EPIPE) {
/* EPIPE means overrun */
fprintf(stderr, "overrun occurred\n");
snd_pcm_prepare(handle);
} else if (rc < 0) {
fprintf(stderr,
"error from read: %s\n",
snd_strerror(rc));
} else if (rc != (int)frames) {
fprintf(stderr, "short read, read %d frames\n", rc);
}
rc = write(1, buffer, size);
if (rc != size)
fprintf(stderr,
"short write: wrote %d bytes\n", rc);
}

snd_pcm_drain(handle);
snd_pcm_close(handle);
free(buffer);

return 0;
}



para compilar no terminal do linux, eu uso este comando: gcc programa.c -lasound
como faço para compilar dentro de um compilador como o ANJUTA do linux?
Obrigado


  


2. Re: Compilador - Duvida basica

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 01/05/2015 - 21:33h

Amigo, não seria assim :

https://www.youtube.com/watch?feature=player_detailpage&v=v2nZ0Qe4MlM#t=233

E na barra com o "--[...]" e coloca " -lasound"

Espero ter ajudado

[]'s

T+


3. Re: Compilador - Duvida basica

Diego
dmt23

(usa Ubuntu)

Enviado em 02/05/2015 - 10:56h

Eu tentei faz isso, mas nao deu certo. Eu encontrei alguns codigo na internet com essa instruçao

#ifdef HAVE_LIBASOUND

voce sabe o que e isso?


4. Vamos lá....

Gabriel Bassani Ribieiro
gbassanir

(usa Debian)

Enviado em 02/05/2015 - 17:07h

Boa tarde,

Let's go!

gcc nomedoprograma.extensão -o nomedoprogra.[1,2]
[1] pode ser .o
[2] pode ser só o nome do programa

Exemplo: Suponha que tenho o seguinte arquivo ""teste.c""

gcc teste.c -o teste.o
ou
gcc teste.c -o teste

Agora vou chama-lo

./teste.o
ou
./teste

Logo

cc -o teste teste.c -lasound

Referente ao #ifdef, leia:
--> https://gcc.gnu.org/onlinedocs/cpp/Ifdef.html

----------------------------------------------------------------------------------
Não gosto de IDE's, apesar de ajudar bastante elas criam muitos arquivos que muitos não nem sabem de sua existência, mas se quiser utilizar, tente criar um projeto em branco. Se quiser usar uma IDE, aconselho usar o [1]qt creator(excelente).
[1] https://www.qt.io/download-open-source/

Quando voltar um erro o compilador, post o erro e quando for postar o código use um [3]site e só mande o link, se for projeto, use o [4]github
[2] http://codepad.org/
[3] https://github.com/

Projetos no github que podem te dar uma luz
--> https://github.com/mistydemeo/libmikmod/blob/master/drivers/drv_alsa.c/
--> http://sourceforge.net/p/mikmod/mercurial/ci/b143066cf2e8e653e51afc5b8d873db192128fee/

Att,



5. Re: Compilador - Duvida basica

Diego
dmt23

(usa Ubuntu)

Enviado em 03/05/2015 - 20:05h

Muito obrigado gbassanir,
Veja se você consegue entender meu problem. quando eu compilo o progama no terminal do linux com gcc, ele funciona perfeitamente, mas quando eu tento compilar em uma IDE, ele nao reconhece alguns termos da biblioteca. veja os erros de compilaçao.

error: undefined reference to `snd_pcm_open'
error: undefined reference to `snd_strerror'


6. Re: Compilador - Duvida basica

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 04/05/2015 - 08:19h

Amigo, por que não utiliza o Code::Blocks ou o Geany? (sudo apt-get install codeblocks ou sudo apt-get install geany , respectivamente)

A Geany eu utilizei por muito tempo e para fazer funcionar é só :

Clicar na setinha ao lado do botão "Construir";
"Definir Comandos de Construção";
Vai abrir uma outra janelinha, então ao lado do botão "Construir", troque para :

gcc -Wall -g -o "%e" "%f" -lasound

Aperte "Ok" e deverá estar funcionando.

Espero ter ajudado

[]'s

T+


7. Vamos lá...

Gabriel Bassani Ribieiro
gbassanir

(usa Debian)

Enviado em 04/05/2015 - 08:42h

Bom dia,

Ele não está encontrando a referencia da função, simples né... O próprio compilador já te informa isso,

Então, você precisa declarar a função para poder usa-la e precisa do arquivo cabeçalho ao qual a função está englobada.

Exemplo, se eu uso um identificador 'r' e não relaciono ao tipo inteiro, o meu compilador avisará que esse identificador não está declarado ou definido, pois ele não encontrou a referência, se eu uso 'pow' ou 'sqrt' e não informo o arquivo-cabeçalho <math.h>, o compilador informará que não encontrou a referência da função utilizada. Está entendendo?!

Veja essa fonte, tenta fazer as modificações, lembre que nunca ganhará a resposta de cara, tem que rala um pouco, mas vendo essas fontes, você entenderá. Parabéns pela iniciativa.

--> http://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m.html
--> http://www.linuxquestions.org/questions/linux-newbie-8/undefined-reference-to-snd_pcm_open-snd_sterr...

Qualquer duvida, estamos a disposição.

Att,






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts