; 
; 
; (c) 1997 Cyborg 

    {* Include sys:coder/preass/Options.p *}
    {* Include sys:coder/preass/Prozeduren.p *}

    {* String: Version="$VER: QT-Sound-RIP (C) CYBORG 97"*}

    {* IncVar: Laenge,Chunk,Offset,Len*}
    {* IncSysBlock: Buffer,200*}
    {* IncSysBlock: Comparespace,100*}

Raw2Iff[a0,d7]:
    subq.l #1,d7
.l1:
    Clr.l d0
    move.b (a0),d0
    subi.l #128,d0
    move.b d0,(a0)+
    dbra d7,.l1
    RTS

Fixname[a0]:
    cmpi.b #`.`,(a0)+  
    bne Fixname
    move.b #`i`,(a0)+
    move.b #`f`,(a0)+
    move.b #`f`,(a0)+
    RTS

Start:
    OH=Output()
    OK=GetFilename()
;    Copymem("dh3:a/ds9ep508.mov",#Filename,?)
    If (FH=Open(#Filename,#Mode_Old))=#0 --> ende
    Read(FH,#Laenge,4)
    If Laenge>#15000 --> .change
.l1:
    Read(FH,#Chunk,4)
.l0:
    Read(FH,#Laenge,4)
.l5:
    If Chunk=#"mdat" --> .mdat
    OK=CountString(#Chunk)
    Write(OH,#Chunk,ok)
    If Chunk=#"mhlr" { 
                       Seek(FH,#12,#Offset_Current)
                       Laenge==0
                       Read(FH,#Laenge+3,1)
                       Read(FH,#Buffer,laenge)
                       Write(OH,":",?)
                       Write(OH,#Buffer,laenge)
                       Seek(FH,#4,#Offset_Current)
                       Write(OH,"\n",?) 
                       IsWild=ParsePatternNoCase("#?Sound#?",#comparespace,100)
                       Match=MatchPatternNoCase(#Comparespace,#Buffer)
                       CheckF Match,.l1
                       Sound==1
                       bra .l1
                     }
    If Chunk=#"dhlr" { 
                       Seek(FH,#12,#Offset_Current)
                       Laenge==0
                       Read(FH,#Laenge+3,1)
                       Read(FH,#Buffer,laenge)
                       Seek(FH,#4,#Offset_Current)
                       Write(OH,":",?)
                       Write(OH,#Buffer,laenge)
                       Write(OH,"\n",?) 
                       bra .l1
                     }
    If Chunk=#"stbl" { 
                       If Sound=#0 --> .l8
                       Seek(FH,#42,#Offset_Current)
                       Read(FH,#Freq,4)
                       Write(OH,"\nFreq:",?)
                       Convertzahl(Freq,OH)
                       Write(OH,"\n",?) 
                       Laenge==Laenge-46
                       Seek(FH,Laenge,#Offset_Current)  
                       bra .l1
                     }
    If Chunk=#"stts" {
                       {* Incvar: Soundlaenge,Freq,ver,bis*}
                       Write(OH,"\nInhalt:",?)
                       IF Sound=#0 --> .l2
                       Read(FH,#Chunk,4)
                       Read(FH,#Soundlaenge,4)
                       Seek(FH,8,#Offset_Current)
.l2:
                       {* Flush *}
                       Read(FH,#Chunk,4)
                       If Chunk=#"stss" -> .skip
                       If Chunk=#"stsc" -> .l6 
                       If Chunk=#"stsz" -> .skip
                       If Chunk=#"stco" -> .l7
                       If Chunk=#"trak" -> .l4
                       If Chunk=#"udta" -> .l4
;                       Convertzahl(Chunk,oh)
;                       Write(OH,",",1)
                       bra .l2
.l6:                   
                       If Sound=#0 --> .skip
                       Read(FH,#Ver,4)
                       Read(FH,#Bis,4)
                       Read(FH,#Buffer,4)
                       SlBytes==Bis*4
                       Bis==Bis-1
                       Slaenge=Allocmem(SlBytes,#MEMF_FAST)
                       If Slaenge##0 {
                                           move.l Slaenge,a5
                                           For I=0 to Bis
                                                Read(FH,#Buffer,4)
                                                Seek(FH,8,#Offset_Current)
                                                Move.l Buffer,(a5)+
                                           Next I
                                         }
                       bra .skip
.l7:                   
                       If Sound=#0 --> .skip
                       {* Flush *}
                       Read(FH,#Ver,4)
                       Read(FH,#Bis,4)
                       SoBytes==Bis*4
                       Bis==Bis-1
                       SOffset=Allocmem(SoBytes,#MEMF_FAST)
                       If SOffset##0 {
                                           Move.l Soffset,a5
                                           For J=0 to Bis
                                                Read(FH,#Buffer,4)
                                                move.l Buffer,(a5)+
                                           Next J
                                         }
                       bra .skip

.skip:
                       {* Flush *}    
                       Write(OH,"\n",?)
                       OK=CountString(#Chunk)
                       Write(OH,#Chunk,ok)
                       Write(OH,"\nInhalt:",?)
                       bra .l2                     
.l4:
                       Write(OH,"\n",?) 
                       bra .l0
                     }
    If Chunk=#"udta" {
                       Laenge==laenge-4
                       Seek(FH,laenge,#Offset_Current)
                       Read(FH,#laenge,4)
                       Seek(FH,laenge,#Offset_Current)
                       Read(FH,#Chunk,4)
                       Seek(FH,8,#Offset_Current)
                       Read(FH,#laenge,4)
                       Read(FH,#Chunk,4)
                       Write(OH,"\n",?)
                       If oldone=#0 -> .l5
                       bra .mdat
                     }
.l8:
    Seek(FH,laenge,#Offset_Current)
    Write(OH," Laenge:\$09",?)
    Convertzahl(Laenge,OH)
    Write(OH,"\n",?)
    bra .l1
.change:
    Oldone==1
    seek(FH,Laenge,#Offset_Current)
    bra .l1
.mdat:
    Fixname(#Filename)
    OutHandle=Open(#Filename,#mode_new)
    Write(Outhandle,"FORM",?)
    Formlaenge==Soundlaenge+40
    Write(Outhandle,#Formlaenge,4)
    Write(Outhandle,"\$38SVXVHDR\$00\$00\$00\$14\$00\$00\$00\$00",?)
    Write(Outhandle,#Soundlaenge,4)
    Write(Outhandle,"\$00\$00\$00\$20",?)
    Write(Outhandle,#Freq+2,2)
    Write(Outhandle,"\$01\$00\$00\$01\$00\$00BODY",?)
    Write(Outhandle,#Soundlaenge,4)
    For K=0 to Bis
        {* Flush *}
        Seek(FH,0,#Offset_Begin)
        Move.l SOffset,A0
        Move.l K,D0
        Move.l (A0,D0*4),D0
        Move.l D0,Offset
        Seek(FH,Offset,#Offset_Current)
        Move.l SLaenge,A0
        Move.l K,D0
        Move.l (A0,D0*4),D0
        Move.l D0,Len
        Len==Len-1
        Readbuffer=AllocMem(Len,#MemF_Fast)
        Read(FH,ReadBuffer,Len)
        Raw2iff(ReadBuffer,Len)
        Write(OutHandle,Readbuffer,len)
        Freemem(ReadBuffer,Len)
    Next K
    Close(OutHandle)
.close:
    {* Flush *}
    If Soffset##0 {
                    Freemem(SOffset,SoBytes)
                  }
    {* Flush *}
    If SLaenge##0 {
                    Freemem(Slaenge,SlBytes)
                  }
    Close(FH)
ende:
    RTS
