![]() |
Re: Dynamische Arrays ... kleines Problem!
Zitat:
|
Re: Dynamische Arrays ... kleines Problem!
@Der_Unwissende:
Macht man das nicht seit neuestem so:
Delphi-Quellcode:
@sonicfire: Du hast den falschen Code von mir kopiert :gruebel: - NEIN verdammt, ich habe den falschen geschrieben! Sorry! das sollte position := Start heissen!
TFileStream.Create(FileName, fmOpenRead, fmShareExclusive); //man beachte das Komma
|
Re: Dynamische Arrays ... kleines Problem!
Danke, Luke!
Quasi so:?
Delphi-Quellcode:
Aber das gibt wieder einen Stream- RuntimeError! :wiejetzt: :gruebel:
Procedure TForm1.LoadTheWave(FileName: String; out Value: TSmallIntArray; Start: Integer = 0);
begin with TFilestream.Create(Filename, fmOpenRead) do try Position := Start; setlength(Value, Size-Position); ReadBuffer(Value,length(Value)); finally Free; end; end; |
Re: Dynamische Arrays ... kleines Problem!
Hmm... eventuell kommst du über den rand hinaus mit dem readbuffer... versuchs mal mit read ohne buffer, evtl. hilft das was.
ich muss mal überlegen... angenommen, wir haben einen header, der 5 bytes lang ist. dann wird als start 6 übergeben, und position = 6. Angenommen Größe 10, wird ...aaaahhh.... :coder2: weiter im text. größe der datei 10, dann haben wir noch 4 bytes zu lesen. also setzen wir die größe des arrays - natürlcih - auf 4 bytes geteilt durch (!) größe unseres datentyps. das ham wir (hab ich) hier schon mal falsch gemacht. also, angenommen
Delphi-Quellcode:
Procedure TForm1.LoadTheWave(FileName: String; out Value: TSmallIntArray; Start: Integer = 0);
begin with TFilestream.Create(Filename, fmOpenRead) do try Position := Start; setlength(Value, (Size-Position) div sizeof(SmallInt)); ReadBuffer(Value,length(Value)); finally Free; end; end; wenn ein smallint 2 byte groß ist (hypothetisch), ist value jetzt 4 / 2 = 2 Smallints groß. Also haben wir vier bytes zu lesen und müssen im readbuffer die Länge wieder auf 4 bringen - also wieder *sizeof(SmallInt):
Delphi-Quellcode:
Das hat uns aber noch nicht weitergebracht als bis dahin, dass das Ergebnis nicht mehr viel zu groß ist - sollte also die Fehler nicht nicht beheben.
Procedure TForm1.LoadTheWave(FileName: String; out Value: TSmallIntArray; Start: Integer = 0);
begin with TFilestream.Create(Filename, fmOpenRead) do try Position := Start; setlength(Value, (Size-Position) div sizeof(SmallInt)); ReadBuffer(Value,length(Value) * sizeof(SmallInt)); finally Free; end; end; EDIT: Wo genau tritt denn der runtime-error auf? Du kannst im Quelltext breakpoints setzen, indem du im editor links neben die zeile klickst (im grauen), wenn der programmcode da vorbeikommt, hält der debugger die ausführung an. damit kannst du genau sehen, wanns knallt. |
Re: Dynamische Arrays ... kleines Problem!
So wie es aussieht crasht es bei
Delphi-Quellcode:
ReadBuffer(Value,length(Value) * sizeof(SmallInt));
|
Re: Dynamische Arrays ... kleines Problem!
Ok, benutze einfach mal Read anstelle von ReadBuffer. :)
|
Re: Dynamische Arrays ... kleines Problem!
Jepp, das funzt soweit .. :)
Nur zerstört er dann am Ende das WAV-File ...hmm... EDIT: Achso! Muss ja noch das Offset für den Header setzen! |
Re: Dynamische Arrays ... kleines Problem!
seufz... jetzt sind im Audio-Teil des WAV´s daten die da nicht hingehören *G* :coder2:
Genauso verwunderlich ist immernoch, das ich den Inhalt vom WavBuffer komplett auf 0 setze, das heisst es müsste totale Stille im WAV sein - aber da ist nichts verändert |
Re: Dynamische Arrays ... kleines Problem!
Rufst du es auch mit Start = sizeof(Header)+1 auf? sonst liest du das letzte byte vom header noch mit aus.
Wo genau setzt du den Inhalt auf 0? Vielleicht irgendwo, wo danach gleich wieder drüber geschrieben wird bzw. in einer lokalen Variable, wo es gar keine Wirkung hat? SaveToFileAppend() ist übrigens dafür gedacht, zuerst den header in die Datei zu schreiben und dann die Daten. Allerdings hat das einiges an Overhead, denn nachdem du den Header geschrieben hast, musst du erst mal die Datei schließen und sie dann (durch aufruf meiner funktion) wieder öffnen und beschreiben. Ist nicht optimal, du solltest beides in einem Aufwasch machen. |
Re: Dynamische Arrays ... kleines Problem!
Eigentlich schon! :)
Momentan versuche ich es so, aber werds jetzt mal innerhalb einer Prozedur versuchen!
Delphi-Quellcode:
Procedure TForm1.ProcessWave(FileName: String);
var Wavbuffer: TSmallIntArray; Header: TWaveHeader; i: Integer; begin LoadTheWave(Outputfile.Text, Wavbuffer, sizeOf(Header)+1); // reine audio daten laden for i := Low(Wavbuffer) to High(Wavbuffer) do // testweise stille einfügen begin // Wavbuffer[i] := Wavbuffer[i]; Wavbuffer[i] := 0; end; SaveTheWave(Outputfile.Text, Wavbuffer, sizeOf(Header)+1); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz