Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.73 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.  
  41. int main(int argc, char *argv[]){  
  42.     argv[1]="-mezclar";
  43.     argv[2]="C:\\Documents and Settings\\laptop\\Escritorio\\UNIANDES\\INFRAESTRUCTURA TECNOLOGICA\\CICLO 2-PROYECTO\\isis1304-102-Proyecto_2\\isis1304-102-Proyecto 2\\data\\mozart1.wav";
  44.     //argv[2]="5000";
  45.     argv[3]="C:\\Documents and Settings\\laptop\\Escritorio\\UNIANDES\\INFRAESTRUCTURA TECNOLOGICA\\CICLO 2-PROYECTO\\isis1304-102-Proyecto_2\\isis1304-102-Proyecto 2\\data\\muestra1.wav";
  46.     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";
  47.      Pista * pista1, * pista2,*pistaDestino;
  48.     pista1 = (Pista *)malloc(sizeof(Pista)); // Reserva suficiente memoria para la estructura pista uno
  49.     pista2 = (Pista *)malloc(sizeof(Pista)); // Reserva suficiente memoria para la estructura pista dos
  50.     pistaDestino = (Pista *)malloc(sizeof(Pista)); // Reserva suficiente memoria para la estructura pista de destino
  51.     if(comparar(argv[1],"-eco")){
  52.         int eco;
  53.         eco=convertir(argv[2]);
  54.         cargarArchivo(pista1, argv[3]);
  55.         introducirEco(pista1,pistaDestino,eco);
  56.         guardarPista(pistaDestino, argv[4]);
  57.         printf("eco= %d \n",eco);
  58.     }else if(comparar(argv[1],"-cortar")){
  59.         int puntoCorte;
  60.         puntoCorte=convertir(argv[2]);
  61.         cargarArchivo(pista1, argv[3]);
  62.         cortar(pista1,pistaDestino,puntoCorte);
  63.         guardarPista(pistaDestino, argv[4]);
  64.     }else if(comparar(argv[1],"-mezclar")){
  65.         cargarArchivo(pista1, argv[2]);
  66.         cargarArchivo(pista2, argv[3]);
  67.         mezclarPistas(pista1,pista2, pistaDestino);
  68.         guardarPista(pistaDestino, argv[4]);
  69.     }
  70.    
  71.     system("pause");
  72.  
  73.     return 0;
  74. }
  75.  
  76.  
  77. //-- Funciones
  78. // Esta funcion se encarga de abrir un archivo que contenga un archivo wav
  79. // y la carga en una estructura Pista cuyo apuntador entra como parametro.
  80. // No hay que completar nada en esta funci�n.
  81. void cargarArchivo(Pista * imagen, char * nomArchivoEntrada){
  82.     FILE * archivoEntrada;
  83.     int e=0;
  84.     archivoEntrada = fopen(nomArchivoEntrada, "rb");
  85.     if (archivoEntrada == 0){
  86.         printf("No ha sido posible cargar el archivo: %s\n", nomArchivoEntrada);
  87.         exit(-1);
  88.     }
  89.     fread(&imagen->chunkId, sizeof(int), 1, archivoEntrada);   
  90.     fread(&imagen->chunkSize, sizeof(int), 1, archivoEntrada); 
  91.     fread(&imagen->Format, sizeof(int), 1, archivoEntrada);
  92.     fread(&imagen->Subchunkid, sizeof(int), 1, archivoEntrada);
  93.     fread(&imagen->subchunk1Size, sizeof(int), 1, archivoEntrada); 
  94.     fread(&imagen->AudioFormat, sizeof(short), 1, archivoEntrada); 
  95.     fread(&imagen->numChanels, sizeof(short), 1, archivoEntrada);  
  96.     fread(&imagen->sampleRate, sizeof(int), 1, archivoEntrada);
  97.     fread(&imagen->ByteRate, sizeof(int), 1, archivoEntrada);  
  98.     fread(&imagen->blockAlign, sizeof(short), 1, archivoEntrada);  
  99.     fread(&imagen->BitsPerSample, sizeof(short), 1, archivoEntrada);   
  100.     fread(&imagen->subChunk2Id, sizeof(int), 1, archivoEntrada);   
  101.     fread(&imagen->subChunk2Size, sizeof(int), 1, archivoEntrada); 
  102.     fread(&imagen->muestras, sizeof(unsigned char), *(&imagen->subChunk2Size), archivoEntrada);
  103.     fclose(archivoEntrada);
  104. }
  105. /*
  106.  Esta funcion se encarga de introducir eco en la pistaDeOrigen y colocarla la nueva pista en pistaDestino
  107.  Se debe completar en su totalidad esta funcion
  108. */
  109. void introducirEco(Pista * pistaOrigen, Pista * pistaDestino,int milisegundos){
  110.     long long indice = 0,retraso;
  111.     printf("\n %d \n",sizeof(indice));
  112.     //TODO completar la función en assembler. Recuerde que debe hacer las modificaciones correspondientes en el encabezado del archivo.
  113.     *(&pistaDestino->AudioFormat) = *(&pistaOrigen->AudioFormat);
  114.     *(&pistaDestino->BitsPerSample) = *(&pistaOrigen->BitsPerSample);
  115.     *(&pistaDestino->blockAlign) = *(&pistaOrigen->blockAlign);
  116.     *(&pistaDestino->ByteRate) = *(&pistaOrigen->ByteRate);
  117.     *(&pistaDestino->chunkId) = *(&pistaOrigen->chunkId);
  118.     *(&pistaDestino->chunkSize)= *(&pistaOrigen->chunkSize);
  119.     *(&pistaDestino->Format) = *(&pistaOrigen->Format);
  120.    
  121.    
  122.     *(&pistaDestino->numChanels) = *(&pistaOrigen->numChanels);
  123.     *(&pistaDestino->sampleRate) = *(&pistaOrigen->sampleRate);
  124.     *(&pistaDestino->subchunk1Size)= *(&pistaOrigen->subchunk1Size);
  125.     *(&pistaDestino->subChunk2Id) = *(&pistaOrigen->subChunk2Id);
  126.     *(&pistaDestino->subChunk2Size) = *(&pistaOrigen->subChunk2Size);
  127.     *(&pistaDestino->Subchunkid) = *(&pistaOrigen->Subchunkid);
  128. *pistaDestino->muestras = *pistaOrigen->muestras;
  129.  
  130.  
  131. }
  132. /*
  133.  Esta funcion se encarga de cortar una pista hasta el tiempo pasado por parametro
  134.  Se debe completar en su totalidad esta funcion
  135. */
  136. void cortar(Pista * pistaOrigen, Pista * pistaDestino,int milisegundos){
  137.     unsigned long long indice = 0,puntoCorte;
  138.     //TODO completar la función en assembler. Recuerde que debe hacer las modificaciones correspondientes en el encabezado del archivo.
  139.     printf("%d tamaño de punto de corte",sizeof(puntoCorte));
  140.    
  141.     puntoCorte=milisegundos/1000*44100;
  142.  
  143.     *(&pistaDestino->sampleRate) =*(&pistaOrigen->sampleRate);
  144.  
  145. printf("%d sample rate \n",pistaOrigen->sampleRate);
  146.     *(&pistaDestino->AudioFormat)=*(&pistaOrigen->AudioFormat);
  147.  
  148.     *(&pistaDestino->BitsPerSample) =*(&pistaOrigen->BitsPerSample);
  149.  
  150.     *(&pistaDestino->blockAlign) =*(&pistaOrigen->blockAlign);
  151.  
  152.     *(&pistaDestino->ByteRate) =*(&pistaOrigen->ByteRate );
  153.  
  154.     *(&pistaDestino->chunkId)=*(&pistaOrigen->chunkId );
  155.  
  156.     *(&pistaDestino->Format) =*(&pistaOrigen->Format);
  157.  
  158.         *(&pistaDestino->numChanels)=*(&pistaOrigen->numChanels);
  159.  
  160.         *(&pistaDestino->subchunk1Size) =*(&pistaOrigen->subchunk1Size);
  161.  
  162.         *(&pistaDestino->subChunk2Id)=*(&pistaOrigen->subChunk2Id);
  163.  
  164.         *(&pistaDestino->subChunk2Size)=puntoCorte*4;
  165.  
  166.         *(&pistaDestino->Subchunkid)=*(&pistaOrigen->Subchunkid);
  167.  
  168.     //  printf("%d subChunk1size \n",pistaOrigen->subchunk1Size);
  169. //printf("%d subChunk2size \n",pistaOrigen->subChunk2Size);
  170.     *(&pistaDestino->chunkSize)=(4+(8+*(&pistaDestino->subChunk2Size))+(8+*(&pistaDestino->subchunk1Size)));
  171.  
  172.    
  173.     printf("%d punto de corte \n",puntoCorte);
  174.    
  175.     for(indice=0;indice<=puntoCorte*4;indice++)
  176.         (pistaDestino->muestras[indice])=(pistaOrigen->muestras[indice]);
  177. }
  178. // Esta funcion se encarga de tomar dos pistas y mezclarlas en la pista de destino
  179. // Se debe completar en su totalidad esta funcion
  180. void mezclarPistas(Pista * pista1,Pista * pista2, Pista * pistaDestino){
  181.     int x = 0;
  182.     Pista * mayor=pista1,* menor=pista2;
  183.     //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.
  184.     if(pista1->muestras < pista2->muestras){
  185.         mayor=pista2;
  186.         menor=pista1;}
  187.  
  188.     *(&pistaDestino->sampleRate) =(*(&pista1->sampleRate)+*(&pista2->sampleRate))/2;
  189.  
  190.     *(&pistaDestino->AudioFormat)=(*(&pista1->AudioFormat)+*(&pista2->AudioFormat))/2;
  191.  
  192.     *(&pistaDestino->BitsPerSample) =(*(&pista1->BitsPerSample)+*(&pista2->BitsPerSample))/2;
  193.  
  194.     *(&pistaDestino->blockAlign) =(*(&pista1->blockAlign)+*(&pista2->blockAlign))/2;
  195.  
  196.     *(&pistaDestino->ByteRate) =(*(&pista1->ByteRate)+*(&pista2->ByteRate))/2;
  197.  
  198.     *(&pistaDestino->chunkId)=*(&mayor->chunkId);
  199.  
  200.     *(&pistaDestino->Format) =*(&mayor->Format);
  201.  
  202.         *(&pistaDestino->numChanels)=(*(&pista1->numChanels)+*(&pista2->numChanels))/2;
  203.  
  204.         *(&pistaDestino->subchunk1Size) =(*(&pista1->subchunk1Size)+*(&pista2->subchunk1Size))/2;
  205.  
  206.         *(&pistaDestino->subChunk2Id)=  *(&mayor->subChunk2Id);
  207.         *(&pistaDestino->subChunk2Size)=*(&mayor->subChunk2Size);
  208.  
  209.         *(&pistaDestino->Subchunkid)=(*(&pista1->Subchunkid)+*(&pista2->Subchunkid))/2;
  210.  
  211.         *(&pistaDestino->chunkSize)=*(&mayor->chunkSize);
  212.     char mask1,mask2,total;
  213.    
  214.     for(x=0;x<=int(menor->muestras);x++){
  215.             //mask1=(*(&mayor->muestras[x]))*2;
  216.             mask1=(*(&mayor->muestras[x]))+'0'-10;
  217.             mask2= *(&menor->muestras[x])+'0'-10;
  218.             total=(mask1+mask2)/2;
  219.             total-='0';
  220.             total+=10;
  221.        
  222.             *(&pistaDestino->muestras[x])=(total*2);
  223.             }
  224.        
  225. }
  226.  
  227. // Esta funcion se encarga de guardar un archivo wav
  228. // No hay que completar nada en esta funcion.
  229. void guardarPista(Pista * pista, char * nomArchivoSalida){
  230.     FILE * archivoSalida;
  231.     archivoSalida = fopen(nomArchivoSalida, "w+b"); // Archivo donde se va a escribir el wav
  232.     if (archivoSalida == 0){
  233.         printf("No ha sido posible crear el archivo: %s\n", nomArchivoSalida);
  234.         exit(-1);
  235.     }
  236.     fwrite(&pista->chunkId, sizeof(int), 1, archivoSalida);  
  237.     fwrite(&pista->chunkSize, sizeof(int), 1, archivoSalida);  
  238.     fwrite(&pista->Format, sizeof(int), 1, archivoSalida); 
  239.     fwrite(&pista->Subchunkid, sizeof(int), 1, archivoSalida); 
  240.     fwrite(&pista->subchunk1Size, sizeof(int), 1, archivoSalida);  
  241.     fwrite(&pista->AudioFormat, sizeof(short), 1, archivoSalida);  
  242.     fwrite(&pista->numChanels, sizeof(short), 1, archivoSalida);   
  243.     fwrite(&pista->sampleRate, sizeof(int), 1, archivoSalida); 
  244.     fwrite(&pista->ByteRate, sizeof(int), 1, archivoSalida);   
  245.     fwrite(&pista->blockAlign, sizeof(short), 1, archivoSalida);   
  246.     fwrite(&pista->BitsPerSample, sizeof(short), 1, archivoSalida);
  247.     fwrite(&pista->subChunk2Id, sizeof(int), 1, archivoSalida);
  248.     fwrite(&pista->subChunk2Size, sizeof(int), 1, archivoSalida);  
  249.     fwrite(&pista->muestras, sizeof(unsigned char), *(&pista->subChunk2Size), archivoSalida);
  250.     fclose(archivoSalida);
  251. }
  252.  
  253. // Funcion que se encarga de comparar dos arreglos de caracteres
  254. // No se debe completar nada de esta funcion
  255. int comparar(char * string1, char * string2){
  256.     int e=0;
  257.     while(string1[e]!=0){
  258.         if(string1[e]!=string2[e])return 0;
  259.         e++;
  260.     }
  261.     if(string1[e]!=string2[e])return 0;
  262.     return 1;
  263. }
  264.  
  265. // Funcion que se encarga de convertir una cadena de caracteres a un numero entero
  266. // No se debe completar nada de esta funcion
  267. int convertir(char * string1){
  268.     int e = 0,s=0;
  269.     while(string1[e]!=0){
  270.         s=s*10+(string1[e]-'0');
  271.         e++;
  272.     }
  273.     return s;
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement