!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! Sergio Steffe' - Laboratorio Sperimentale di Matematica Computazionale
! Dipartimento di Matematica - Universita' di Pisa - AA 2002/2003
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
program inverti
!
!!!!!!!!!!!!!!! descrizione !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
!prende un file stereo 16 bit PCM big endian e 
!   lo salva invertendo l'ordine dei record sonori 
!
!!!!!!!!!!!!!!! dichiarazioni !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
IMPLICIT NONE
!
!
DOUBLE PRECISION :: fsample=44100.0
DOUBLE PRECISION :: ttot
!
!numero capionature
INTEGER :: i=0
!
INTEGER                                 :: numrecord
INTEGER(2)                              :: ii,jj
!

!
!errore in lettura file: + se errore; 0 se ok; - se end of file
INTEGER ioerr
!
!nome del file di output
CHARACTER(len=25) FILENAMEOUT
!
!posfisso da aggiungere al nome file
CHARACTER(len=4) :: POSTF='.cdr'
!
!variabile per lettura nome file output
CHARACTER(len=20) FILENAME1
!
!nome del file di input
CHARACTER(len=64) FILENAMEIN
!
!
!
!!!!!!!!!!!!!! inizio !!!!!!!!!!!!!!!!!!!!!!!!!!!
!si aprono i files
!REPLACE crea o cancella se esistente
!UNFORMATTED usa formato interno per salvare i dati
!DIRECT usa l'accesso ad un qualsiasi record
!RECL e' la lunghezza di ogni record (4 bytes)
!
write(*,*)'Nome del file di input:'
read(*,*)FILENAMEIN
!write(*,*)'hai detto: ',FILENAMEIN
!
open(unit=11,file=FILENAMEIN,status='OLD',form='UNFORMATTED',access='DIRECT',RECL=4,ERR=101)
!
write(*,*)'Nome del file di output (max 20 char senza spazi): '
read(*,*) FILENAME1
FILENAMEOUT = FILENAME1(1:SCAN( FILENAME1,' ',.FALSE.)-1)//POSTF
!write(*,*)'hai detto: ',FILENAMEOUT
!
open(unit=10,file=FILENAMEOUT,status='REPLACE',form='UNFORMATTED',access='DIRECT',RECL=4)
!
!calcola lunghezza del file
i=0
DO
i=i+1
read(11,rec=i,IOSTAT=ioerr)ii,jj
IF (ioerr /= 0) EXIT
END DO
!
numrecord=i-1
!
!loop principale: legge in fondo e scrive in testa
! ripetere fino a fine del file
!
ioerr=0
!
DO i=1,numrecord
read(11,rec=numrecord-i+1,IOSTAT=ioerr)ii,jj
IF (ioerr /= 0) EXIT
!
write(10,rec=i) ii,jj
!

END DO	
!
close(10)
close(11)
!
ttot=numrecord/fsample
write(*,501)ttot,FILENAMEOUT
501 FORMAT('Scritti',F5.1,' secondi suono (PCM 2x16 bit big endian) nel file: ',A)
GOTO 202
!
101 write(*,*)'ERRORE aprendo in lettura il file: ',FILENAMEIN
GOTO 202
102  write(*,*)'ERRORE leggendo il file: ',FILENAMEIN
ttot=i
ttot=ttot/fsample
write(*,*)'(dopo ',ttot,' secondi di audio)'

GOTO 202
202 CONTINUE
end program inverti
