Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.38 KB | None | 0 0
  1. //#include "stdafx.h"
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. //-- Estructuras
  7.  
  8. typedef struct {
  9.     int chunkId,chunkSize,Format,Subchunkid,subchunk1Size;
  10.     short AudioFormat,numChanels;
  11.     int sampleRate,ByteRate;
  12.     short blockAlign,BitsPerSample;
  13.     int subChunk2Id,subChunk2Size;
  14.     unsigned char muestras[59909440];
  15. } Pista; // Estructura para guardar las pistas wav
  16.  
  17.  
  18. //-- Prototipos de las funciones
  19. int comparar(char * string1, char * string2); // Funcion que se encarga de comparar dos cadenas de caracteres
  20. int convertir(char * string1); // Funcion que se encarga de convertir un arreglo de caracteres a un numero entero
  21. void cargarArchivo(Pista * pista, char * nom); // Funcion que carga un archivo wav en memoria ram
  22. void cortar(Pista * pistaOrigen, Pista * pistaDestino,int milisegundos); // Funcion que corta una pista hasta la longitud deseada en milisegundos
  23. void introducirEco(Pista * pistaOrigen, Pista * pistaDestino,int milisegundos); // Funcion que introduce eco a un archivo wav
  24. void mezclarPistas(Pista * pista1,Pista * pista2, Pista * pistaDestino); // Funcion que se encarga de mezclar dos pistas
  25. void guardarPista(Pista * pista, char * nomArchivoSalida); // Funcion que guarda el contenido de la estructura imagen en un archivo binario
  26.  
  27. //-- Funcion main de la aplicacion
  28. // Funcion principal del programa.
  29. // La aplicacion recibe un parametro que indica el tipo de operacion a realizar
  30. // Si la operacion es de eco entonces se esperan tres parametros que son:
  31. //      El primero es el retardo en milisegundos
  32. //      El segundo es la ruta del archivo fuente, en formato wav
  33. //      El tercero es la ruta del archivo destino, en formato wav
  34. // Si la operacion es de mezcla entonces se esperan tres parametros que son:
  35. //      El primero es la ruta del archivo con la primera pista a mezclar
  36. //      El segundo es la ruta del archivo con la segunda pista a mezclar
  37. //      El tercero es la ruta del archivo destino, en formato wav
  38. // Todos los parametros necesarios para una operacion deben ser ingresados para el correcto funcionamiento del programa.
  39. // No hay que completar nada en esta funcion.
  40.  int main(int argc, char *argv[]){ 
  41.     argv[1]="-cortar";
  42.     //argv[2]="C:\\Documents and Settings\\laptop\\Escritorio\\UNIANDES\\INFRAESTRUCTURA TECNOLOGICA\\CICLO 2-PROYECTO\\isis1304-102-Proyecto_2\\isis1304-102-Proyecto 2\\data\\muestra1.wav";
  43.     argv[2]="5000";
  44.     argv[3]="C:\\Documents and Settings\\laptop\\Escritorio\\UNIANDES\\INFRAESTRUCTURA TECNOLOGICA\\CICLO 2-PROYECTO\\isis1304-102-Proyecto_2\\isis1304-102-Proyecto 2\\data\\muestra2.wav";
  45.     argv[4]="C:\\Documents and Settings\\laptop\\Escritorio\\UNIANDES\\INFRAESTRUCTURA TECNOLOGICA\\CICLO 2-PROYECTO\\isis1304-102-Proyecto_2\\isis1304-102-Proyecto 2\\data\\muestra1y2.wav";
  46.      Pista * pista1, * pista2,*pistaDestino;
  47.     pista1 = (Pista *)malloc(sizeof(Pista)); // Reserva suficiente memoria para la estructura pista uno
  48.     pista2 = (Pista *)malloc(sizeof(Pista)); // Reserva suficiente memoria para la estructura pista dos
  49.     pistaDestino = (Pista *)malloc(sizeof(Pista)); // Reserva suficiente memoria para la estructura pista de destino
  50.     if(comparar(argv[1],"-eco")){
  51.         int eco;
  52.         eco=convertir(argv[2]);
  53.         cargarArchivo(pista1, argv[3]);
  54.         introducirEco(pista1,pistaDestino,eco);
  55.         guardarPista(pistaDestino, argv[4]);
  56.         printf("eco= %d \n",eco);
  57.     }else if(comparar(argv[1],"-cortar")){
  58.         int puntoCorte;
  59.         puntoCorte=convertir(argv[2]);
  60.         cargarArchivo(pista1, argv[3]);
  61.         cortar(pista1,pistaDestino,puntoCorte);
  62.         guardarPista(pistaDestino, argv[4]);
  63.     }else if(comparar(argv[1],"-mezclar")){
  64.         cargarArchivo(pista1, argv[2]);
  65.         cargarArchivo(pista2, argv[3]);
  66.         mezclarPistas(pista1,pista2, pistaDestino);
  67.         guardarPista(pistaDestino, argv[4]);
  68.     }
  69.    
  70.     system("pause");
  71.  
  72.     return 0;
  73. }
  74.  
  75.  
  76. //-- Funciones
  77. // Esta funcion se encarga de abrir un archivo que contenga un archivo wav
  78. // y la carga en una estructura Pista cuyo apuntador entra como parametro.
  79. // No hay que completar nada en esta funci�n.
  80. void cargarArchivo(Pista * imagen, char * nomArchivoEntrada){
  81.     FILE * archivoEntrada;
  82.     int e=0;
  83.     archivoEntrada = fopen(nomArchivoEntrada, "rb");
  84.     if (archivoEntrada == 0){
  85.         printf("No ha sido posible cargar el archivo: %s\n", nomArchivoEntrada);
  86.         exit(-1);
  87.     }
  88.     fread(&imagen->chunkId, sizeof(int), 1, archivoEntrada);   
  89.     fread(&imagen->chunkSize, sizeof(int), 1, archivoEntrada); 
  90.     fread(&imagen->Format, sizeof(int), 1, archivoEntrada);
  91.     fread(&imagen->Subchunkid, sizeof(int), 1, archivoEntrada);
  92.     fread(&imagen->subchunk1Size, sizeof(int), 1, archivoEntrada); 
  93.     fread(&imagen->AudioFormat, sizeof(short), 1, archivoEntrada); 
  94.     fread(&imagen->numChanels, sizeof(short), 1, archivoEntrada);  
  95.     fread(&imagen->sampleRate, sizeof(int), 1, archivoEntrada);
  96.     fread(&imagen->ByteRate, sizeof(int), 1, archivoEntrada);  
  97.     fread(&imagen->blockAlign, sizeof(short), 1, archivoEntrada);  
  98.     fread(&imagen->BitsPerSample, sizeof(short), 1, archivoEntrada);   
  99.     fread(&imagen->subChunk2Id, sizeof(int), 1, archivoEntrada);   
  100.     fread(&imagen->subChunk2Size, sizeof(int), 1, archivoEntrada); 
  101.     fread(&imagen->muestras, sizeof(unsigned char), *(&imagen->subChunk2Size), archivoEntrada);
  102.     fclose(archivoEntrada);
  103. }
  104. /*
  105.  Esta funcion se encarga de introducir eco en la pistaDeOrigen y colocarla la nueva pista en pistaDestino
  106.  Se debe completar en su totalidad esta funcion
  107. */
  108. void introducirEco(Pista * pistaOrigen, Pista * pistaDestino,int milisegundos){
  109.     long long indice = 0,retraso;
  110.     printf("\n %d \n",sizeof(indice));
  111.     //TODO completar la función en assembler. Recuerde que debe hacer las modificaciones correspondientes en el encabezado del archivo.
  112.     *(&pistaDestino->AudioFormat) = *(&pistaOrigen->AudioFormat);
  113.     *(&pistaDestino->BitsPerSample) = *(&pistaOrigen->BitsPerSample);
  114.     *(&pistaDestino->blockAlign) = *(&pistaOrigen->blockAlign);
  115.     *(&pistaDestino->ByteRate) = *(&pistaOrigen->ByteRate);
  116.     *(&pistaDestino->chunkId) = *(&pistaOrigen->chunkId);
  117.     *(&pistaDestino->chunkSize)= *(&pistaOrigen->chunkSize);
  118.     *(&pistaDestino->Format) = *(&pistaOrigen->Format);
  119.    
  120.    
  121.     *(&pistaDestino->numChanels) = *(&pistaOrigen->numChanels);
  122.     *(&pistaDestino->sampleRate) = *(&pistaOrigen->sampleRate);
  123.     *(&pistaDestino->subchunk1Size)= *(&pistaOrigen->subchunk1Size);
  124.     *(&pistaDestino->subChunk2Id) = *(&pistaOrigen->subChunk2Id);
  125.     *(&pistaDestino->subChunk2Size) = *(&pistaOrigen->subChunk2Size);
  126.     *(&pistaDestino->Subchunkid) = *(&pistaOrigen->Subchunkid);
  127. *pistaDestino->muestras = *pistaOrigen->muestras;
  128.  
  129.  
  130. }
  131. /*
  132.  Esta funcion se encarga de cortar una pista hasta el tiempo pasado por parametro
  133.  Se debe completar en su totalidad esta funcion
  134. */
  135. void cortar(Pista * pistaOrigen, Pista * pistaDestino,int milisegundos){
  136.     unsigned long long indice = 0,puntoCorte;
  137.     //TODO completar la función en assembler. Recuerde que debe hacer las modificaciones correspondientes en el encabezado del archivo.
  138.     puntoCorte=milisegundos/1000*44100;
  139.     *(&pistaDestino->sampleRate) =*(&pistaOrigen->sampleRate);
  140.     printf("%d sample rate \n",pistaOrigen->sampleRate);
  141.     *(&pistaDestino->AudioFormat)=*(&pistaOrigen->AudioFormat);
  142.     *(&pistaDestino->BitsPerSample) =*(&pistaOrigen->BitsPerSample);
  143.     *(&pistaDestino->blockAlign) =*(&pistaOrigen->blockAlign);
  144.     *(&pistaDestino->ByteRate) =*(&pistaOrigen->ByteRate );
  145.     *(&pistaDestino->chunkId)=*(&pistaOrigen->chunkId );
  146.     *(&pistaDestino->Format) =*(&pistaOrigen->Format);
  147.     *(&pistaDestino->numChanels)=*(&pistaOrigen->numChanels);
  148.     *(&pistaDestino->subchunk1Size) =*(&pistaOrigen->subchunk1Size);
  149.     *(&pistaDestino->subChunk2Id)=*(&pistaOrigen->subChunk2Id);
  150.     *(&pistaDestino->subChunk2Size)=puntoCorte+44100*16;//*(&pistaOrigen->subChunk2Size)/(milisegundos/1000);
  151.     *(&pistaDestino->Subchunkid)=*(&pistaOrigen->Subchunkid);
  152. printf("%d subChunk1size \n",pistaOrigen->subchunk1Size);
  153. printf("%d subChunk2size \n",pistaOrigen->subChunk2Size);
  154.     *(&pistaDestino->chunkSize)=(4+8+*(&pistaDestino->subChunk2Size)+8+*(&pistaDestino->subchunk1Size));//pistaOrigen->chunkSize;
  155. printf("%d punto de corte \n",puntoCorte);
  156.     for(indice=0;indice<=puntoCorte*4;indice++)
  157.         (pistaDestino->muestras[indice])=(pistaOrigen->muestras[indice]);
  158. }
  159. // Esta funcion se encarga de tomar dos pistas y mezclarlas en la pista de destino
  160. // Se debe completar en su totalidad esta funcion
  161. void mezclarPistas(Pista * pista1,Pista * pista2, Pista * pistaDestino){
  162.     int x = 0;
  163.     Pista * mayor=pista1,* menor=pista2;
  164.     //TODO completar la función en assembler (Puede que pista2 y en consecuencia menor sea la pista de mayor longitud, debe contemplar ese caso). Recuerde que debe hacer las modificaciones correspondientes en el encabezado del archivo.
  165.  
  166. }
  167.  
  168. // Esta funcion se encarga de guardar un archivo wav
  169. // No hay que completar nada en esta funcion.
  170. void guardarPista(Pista * pista, char * nomArchivoSalida){
  171.     FILE * archivoSalida;
  172.     archivoSalida = fopen(nomArchivoSalida, "w+b"); // Archivo donde se va a escribir el wav
  173.     if (archivoSalida == 0){
  174.         printf("No ha sido posible crear el archivo: %s\n", nomArchivoSalida);
  175.         exit(-1);
  176.     }
  177.     fwrite(&pista->chunkId, sizeof(int), 1, archivoSalida);  
  178.     fwrite(&pista->chunkSize, sizeof(int), 1, archivoSalida);  
  179.     fwrite(&pista->Format, sizeof(int), 1, archivoSalida); 
  180.     fwrite(&pista->Subchunkid, sizeof(int), 1, archivoSalida); 
  181.     fwrite(&pista->subchunk1Size, sizeof(int), 1, archivoSalida);  
  182.     fwrite(&pista->AudioFormat, sizeof(short), 1, archivoSalida);  
  183.     fwrite(&pista->numChanels, sizeof(short), 1, archivoSalida);   
  184.     fwrite(&pista->sampleRate, sizeof(int), 1, archivoSalida); 
  185.     fwrite(&pista->ByteRate, sizeof(int), 1, archivoSalida);   
  186.     fwrite(&pista->blockAlign, sizeof(short), 1, archivoSalida);   
  187.     fwrite(&pista->BitsPerSample, sizeof(short), 1, archivoSalida);
  188.     fwrite(&pista->subChunk2Id, sizeof(int), 1, archivoSalida);
  189.     fwrite(&pista->subChunk2Size, sizeof(int), 1, archivoSalida);  
  190.     fwrite(&pista->muestras, sizeof(unsigned char), *(&pista->subChunk2Size), archivoSalida);
  191.     fclose(archivoSalida);
  192. }
  193.  
  194. // Funcion que se encarga de comparar dos arreglos de caracteres
  195. // No se debe completar nada de esta funcion
  196. int comparar(char * string1, char * string2){
  197.     int e=0;
  198.     while(string1[e]!=0){
  199.         if(string1[e]!=string2[e])return 0;
  200.         e++;
  201.     }
  202.     if(string1[e]!=string2[e])return 0;
  203.     return 1;
  204. }
  205.  
  206. // Funcion que se encarga de convertir una cadena de caracteres a un numero entero
  207. // No se debe completar nada de esta funcion
  208. int convertir(char * string1){
  209.     int e = 0,s=0;
  210.     while(string1[e]!=0){
  211.         s=s*10+(string1[e]-'0');
  212.         e++;
  213.     }
  214.     return s;
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement