Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Leer Un Archivo Wav, Guardar Sólo Los Datos Audio Y Ejecutarlos. Todo Esto...
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Leer Un Archivo Wav, Guardar Sólo Los Datos Audio Y Ejecutarlos. Todo Esto Exclusivamente Con Funciones Externas 
 
Ayer, 15 de Agosto, yo he estado encerrado en convento en plena adoración extática del venerable Santo Midi.
Iluminado por el Santo, semper benedictus, escribí un código simple y corto que, utilizando exclusivamente las funciones externas del lenguaje C, lee un archivo de audio WAV, extrapola solo los datos de audio que finalmente va a escribir en un nuevo archivo. Luego, usando las funciones externas de ALSA ejecuta estos datos de audio.

En resumen, no he utilizado ninguna función nativa de gambas, sólo funciones externas.

Código comentado en italiano, disculpe.

Private Const BUFFER As Long = 512


Library "libc:6"

Private Const SEEK_SET As Integer = 0
Private Const SEEK_CUR As Integer = 1
Private Const SEEK_END As Integer = 2
Private Const SIGKILL As Integer = 9

' FILE *fopen (const char *__restrict __filename, const char *__restrict __modes)
' Open a file and create a new stream for it.
Private Extern fopen(__filename As String, __modes As String) As Pointer

' int printf (const char *__restrict __format, ...)
' Write formatted output to stdout.
Private Extern printf(__format As String) As Integer
Private Extern printf_2(__format As String, param1 As Integer, param2 As Integer, param3 As Float) As Integer Exec "printf"

' int kill (__pid_t __pid, int __sig)
' Send signal SIG to process number PID.
Private Extern kill_c(__pid As Integer, __sig As Integer) As Integer Exec "kill"

' int fseek (FILE *__stream, long int __off, int __whence)
' Seek to a certain position on STREAM.
Private Extern fseek(__stream As Pointer, __off As Long, __whence As Integer) As Integer

' long int ftell (FILE *__stream)
' Return the current position of STREAM.
Private Extern ftell(__stream As Pointer) As Long

' void *malloc (size_t __size)
' Allocate SIZE bytes of memory.
Private Extern malloc(__size As Long) As Pointer

' size_t fread (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream)
' Read chunks of generic data from STREAM.
Private Extern fread(__ptr As Pointer, __size As Long, __n As Long, __stream As Pointer) As Long

' int sprintf (char *__restrict __s, const char *__restrict __format, ...)
' Write formatted output to S.
Private Extern sprintf(__str As Pointer, __format As String, param1 As Pointer) As Integer

' int strncmp (const char *__s1, const char *__s2, size_t __n)
' Compare N characters of S1 and S2.
Private Extern strncmp(__s1 As Pointer, __s2 As String, __n As Long) As Integer

' size_t fwrite (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __s)
' Write chunks of generic data to STREAM.
Private Extern fwrite(__ptr As Pointer, __size As Long, __n As Long, __stream As Pointer) As Long

' int fclose (FILE *__stream)
' Close STREAM.
Private Extern fclose(__stream As Pointer) As Integer

' void free (void *__ptr)
' Free a block allocated by `malloc'.
Private Extern free_c(__ptr As Pointer) Exec "free"

'''''''''''''''''''''''''''''''''''''''''''''''''''

Library "libasound:2"

Private Const SND_PCM_STREAM_PLAYBACK As Integer = 0
Private Const SND_PCM_FORMAT_S16_LE As Integer = 2
Private Const SND_PCM_ACCESS_RW_INTERLEAVED As Integer = 3

' int snd_pcm_open (snd_pcm_t **pcm, const char *name, snd_pcm_stream_t stream, int mode)
' Opens a PCM.
Private Extern snd_pcm_open(pcm As Pointer, nome As String, stream As Integer, mode As Integer) As Integer

' const char * snd_strerror (int errnum)
' Returns the message for an Error code.
Private Extern snd_strerror(errnum As Integer) As String

' int snd_pcm_set_params (snd_pcm_t *pcm, snd_pcm_format_t format, snd_pcm_access_t access, unsigned int canali, unsigned int rate, int soft_resample, unsigned  int latency)
' Set the hardware and software parameters in a simple way.
Private Extern snd_pcm_set_params(pcm As Pointer, formatI As Integer, accessI As Integer, channels As Integer, rate As Integer, soft_resample As Integer, latency As Integer) As Integer

' snd_pcm_sframes_t snd_pcm_writei (snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size)
' Write interleaved frames to a PCM.
Private Extern snd_pcm_writei(pcm As Pointer, buffer As Pointer, uframes As Long) As Integer

' int snd_pcm_drain (snd_pcm_t *pcm)
' Stop a PCM preserving pending frames.
Private Extern snd_pcm_drain(pcm As Pointer) As Integer

' int snd_pcm_close (snd_pcm_t *pcm)
' Close PCM handle.
Private Extern snd_pcm_close(pcm As Pointer) As Integer


Public Sub Main()

  Dim filewav As String
  Dim ent, ptr, usc, pcm As Pointer
  Dim lun, sp, off As Long
  Dim ii As New Integer[1]
  Dim err, tot As Integer
  Dim cc As New Short[1]
  Dim h, m As Short
  Dim sec As Float
  
  filewav = "/ruta/del/archivo.wav"

' Apre il file "wav" in sola "lettura" binaria:
  ent = fopen(filewav, "r")
  If ent == 0 Then
    printf("ERRORE in lettura del file wav!")
    kill_c(0, SIGKILL)
  Endif
  
' Posiziona il puntatore nell'area di memoria, puntata dalla variabile "ent", alla fine del flusso:
  fseek(ent, 0, SEEK_END)

' Ritorna la quantità di dati contenuti nell'area di memoria, puntata dalla variabile "ent":
  lun = ftell(ent)
  
' Alloca un'area di memoria di lunghezza pari al valore contenuto dalla varibile "lun":
  ptr = malloc(lun)
 
' Riposiziona il Puntatore all'inizio del file, per poter leggere tutti i suoi dati:
  fseek(ent, 0, SEEK_SET)
' Legge l'intera quantità di dati del file wav:
  fread(ptr, 1, lun, ent)
  
' Assegna un numero di byte, presenti nell'area puntata dal Puntatore "ptr", pari alla quantità di byte occupata da un "Intero Corto".
' L'assegnazione comincia dal byte di indice 22 per estrarre il numero dei canali del file wav.
  sprintf(cc.Data, "%s", ptr + 22)
  
' Assegna un numero di byte, presenti nell'area puntata dal Puntatore "ptr", pari alla quantità di byte occupata da un "Intero".
' L'assegnazione comincia dal byte di indice 24 per estrarre il valore della frequenza di campionamento del file wav.
  sprintf(ii.Data, "%s", ptr + 24)
  
  sp = 35

  Repeat
' Legge il file a cominciare dal 37° byte (indice 36), sino a quando non trova i caratteri "data":
    Inc sp
  Until strncmp(ptr + sp, "data", 4) == 0
  
' Incrementa di otto unità la variabile "sp", per raggiungere l'indice del byte di inizio dei dati audio grezzi:
  sp += 8
  
' Apre il file dei dati grezzi wav in sola "scrittura" binaria:
  usc = fopen("/tmp/datigrezzi", "w")
   If ent == 0 Then
    printf("ERRORE in scrittura del file wav!")
    kill_c(0, SIGKILL)
  Endif
  
' Scrive i dati, precedentemente letti, in un nuovo file contenente i soli dati audio wav:
  fwrite(ptr + sp, 1, lun - sp, usc)
' Chiude il flusso di dati in uscita per consentire la scrittura tottale dei dati grezzi nel file:
  fclose(usc)
  
  
'''' ALSA ''''

' Apre il sub-sistema "PCM" di ALSA:
  err = snd_pcm_open(VarPtr(pcm), "default", SND_PCM_STREAM_PLAYBACK, 0)
  If err < 0 Then
    printf("Errore nell'apertura del subsistema PCM: " & snd_strerror(err))
    kill_c(0, SIGKILL)
  Endif
  
' Imposta gli opportuni parametri:
  err = snd_pcm_set_params(pcm, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, cc[0], ii[0], 1, 500000)
  If err < 0 Then
    printf("Errore nell'impostazione dei parametri audio: " & snd_strerror(err))
    kill_c(0, SIGKILL)
  Endif
  
  Repeat
' Scrive i dati letti nel sub-sistema "PCM" di ALSA.
' Ad ogni giro il Puntatore avanza di BUFFER byte in avanti nell'area di memoria puntata.
    err = snd_pcm_writei(pcm, ptr + sp + off, BUFFER / 4)
    tot += err
    sec = tot / ii[0]
    h = (sec / 3600)
    m = (sec - (3600 * h)) / 60
' Mostra il tempo trascorso:
    printf_2("\rTempo trascorso: %d:%d:%.3lf", h, m, (sec - (3600 * h) - (m * 60)))
    off += BUFFER
  Until tot >= lun / 4
  
' Impedisce che avvenga un troncamento inaspettato del processo dei dati audio finali:
  snd_pcm_drain(pcm)
  
  
' Libera la memoria precedentemente allocata:
  snd_pcm_close(pcm)
  free_c(ptr)
  fclose(ent)

End

 



 
última edición por vuott el Sabado, 17 Agosto 2019, 15:26; editado 9 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Leer Un Archivo Wav, Guardar Sólo Los Datos Audio Y Ejecutarlos. Todo Esto Exclusivamente Con Funciones Externas 
 


Ya ves, tu en un convento y yo me paso todo el día en los infiernos. Claro que habría que decir cual infierno, se supone que
hay más de uno ( Según Dante). Error, solo hay uno y hay overbooking. Estamos desbordados, no sabemos donde meter a tanta gente.
Vamos a tener que hacer unas reformas, cada vez viene más gente..

Vaya, funciones externas...blasfemia!.  

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Leer Un Archivo Wav, Guardar Sólo Los Datos Audio Y Ejecutarlos. Todo Esto Exclusivamente Con Funciones Externas 
 
Tentado por el lado oscuro has sido. Mantenido en la Luz te has. La Serpiente Oscura con tu maestría de la fuerza no pudo. Bien hecho guerrero Jedi.

       
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Leer Un Archivo Wav, Guardar Sólo Los Datos Audio Y Ejecutarlos. Todo Esto Exclusivamente Con Funciones Externas 
 
shordi escribió: [Ver mensaje]
La Serpiente Oscura con tu maestría de la fuerza no pudo. Bien hecho guerrero Jedi.


Los malditos signos pythonísticos en mis códigos nunca encontrarás, Maestro.
 



 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Leer Un Archivo Wav, Guardar Sólo Los Datos Audio Y Ejecutarlos. Todo Esto Exclusivamente Con Funciones Externas 
 
Habría que buscar la forma de llegar a hacer el programa en gambas con apoyo de una librería pero
sin llegar a ser un código en basic con tanto Exterm.

Es complicado ya que a lo mejor habría que hacer en "C" código muy personales y a la larga no vale.
Si tenemos audio en gambas, pues ampliar el código dedicado a esto, dotándolo de funciones que se usa
con mucha normalidad. gambas tiene las suyas.
 
¿ Eso no es reinventar la rueda ?.  Pues eso no le gusta a muchos programadores.  
Distinto es como satisfacción personal y como algo didáctico.

En el manual de gambas ( el libro de gambas 2 ), la idea del programador principal de gambas como deberá ser la de
cualquier programador. Es la de poder aprovechar los recursos que tiene el sistema y no crear
un software de cero.

En parte hay una contradicción. Nativo, externo.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Leer Un Archivo Wav, Guardar Sólo Los Datos Audio Y Ejecutarlos. Todo Esto Exclusivamente Con Funciones Externas 
 
Shell escribió: [Ver mensaje]
Habría que buscar la forma de llegar a hacer el programa en gambas con apoyo de una librería pero
sin llegar a ser un código en basic con tanto Exterm.

Si tenemos audio en gambas, pues ampliar el código dedicado a esto, dotándolo de funciones que se usa
con mucha normalidad. gambas tiene las suyas.
 
¿ Eso no es reinventar la rueda ?

Consul,
quien ha dicho que se debe escribir programas de gambas con tanto Extern ?
Tambien en el foro italiano alguien no entendió que simplemente yo escribí aquel codigo con "tanto Extern" solo como experimento por diversión.  


Shell escribió: [Ver mensaje]
Si tenemos audio en gambas, pues ampliar el código dedicado a esto, dotándolo de funciones que se usa
con mucha normalidad. gambas tiene las suyas.
 
¿ Eso no es reinventar la rueda ?

Consul,
todos saben que gambas tiene sus funciones.
 



 
última edición por vuott el Viernes, 16 Agosto 2019, 22:37; editado 1 vez 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Leer Un Archivo Wav, Guardar Sólo Los Datos Audio Y Ejecutarlos. Todo Esto Exclusivamente Con Funciones Externas 
 
Shell escribió: [Ver mensaje]
Habría que buscar la forma de llegar a hacer el programa en gambas con apoyo de una librería pero
sin llegar a ser un código en basic con tanto Exterm.

Es complicado ya que a lo mejor habría que hacer en "C" código muy personales y a la larga no vale.
Si tenemos audio en gambas, pues ampliar el código dedicado a esto, dotándolo de funciones que se usa
con mucha normalidad. gambas tiene las suyas.
 
¿ Eso no es reinventar la rueda ?.  Pues eso no le gusta a muchos programadores.  
Distinto es como satisfacción personal y como algo didáctico.

En el manual de gambas ( el libro de gambas 2 ), la idea del programador principal de gambas como deberá ser la de
cualquier programador. Es la de poder aprovechar los recursos que tiene el sistema y no crear
un software de cero.

En parte hay una contradicción. Nativo, externo.

Saludos


Hola, Yo no salgo a defender a nadie, vale. Es mas yo no tengo ni que decir nada aquí. Pero te referencio a ti Shell por que aunque no puedo decir que sé. Estoy empezando a ver algo de luz.

Este es un tema vuestro: https://foro.gambas-es.org/viewtopic.php?f=4&t=2273&highlight=

Hay tú "Shell" dices que no es difícil de crear el componente ProgressBar, pero ahí esta la misma critica que yo puedo ponerte a ti mismo.

Yo quería cambiar el color de la barra de progresos en ProgressBar y hace unos días me baje la Clase ProgressBar de gambas (oficial) y me pregunté a mi mismo por que voy a crear la rueda, si esta, esta Clase ya esta creada. Entonces por diversión, cambié algunas lineas, lo mínimo, y ahora tengo implementado el cambio de color a mi gusto así como si no le pongo ningún color me pone el color que tenga asignado el sistema.

Esto según tú (Shell) es lo correcto y yo opino igual, pero a veces y a mi también me pasa, no hacemos lo que predicamos, por ejemplo en la ruta web del foro que yo te he nombrado.

Y con esto no estoy con nadie en dar la razón.

Y por favor es solo una opinión que no va dirigido a alborotar a nadie.

Saludos
 



 
última edición por gambafeliz el Viernes, 16 Agosto 2019, 16:04; editado 1 vez 
gambafeliz - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron