AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Delphi type nach c#

Ein Thema von EWeiss · begonnen am 5. Nov 2014 · letzter Beitrag vom 6. Nov 2014
Antwort Antwort
Seite 2 von 2     12
EWeiss
(Gast)

n/a Beiträge
 
#11

AW: Delphi type nach c#

  Alt 6. Nov 2014, 05:16
Zitat:
Anders würde man das in Delphi auch nicht machen können.
In Delphi mache ich folgendes.

Delphi-Quellcode:
function TBASSBoxVis.GetWaveData: TWaveData;
begin
  // Get Wave data from stream
  if Basswasapi_Loaded and USE_WASAPI then
    BASS_WASAPI_GetData(@Result, 1024)
  else
  Bass_ChannelGetdata(BB_VisRenderThread.Stream, @Result, 1024);

end;

function TBASSBoxVis.GetWaveData32: TWaveData32;
begin
  // Get Wave data from 32 Bit stream
  if Basswasapi_Loaded and USE_WASAPI then
    BASS_WASAPI_GetData(@Result, 4096)
  else
  Bass_ChannelGetdata(BB_VisRenderThread.Stream, @Result, 4096);

end;
Wird wie folgt ausgeführt
Delphi-Quellcode:
    if (ChanInfo.flags and BASS_SAMPLE_FLOAT) = BASS_SAMPLE_FLOAT then
    begin
      FWaveData32 := GetWaveData32;
      for i := 0 to 1023 do
        if FWaveData32[i] > 0 then
          FWaveData[i] := round(Min(FWaveData32[i] * 32768, 32767))
        else
        FWaveData[i] := round(Max(FWaveData32[i] * 32768, -32768));
    end else
    FWaveData := GetWaveData;

    RenderOpenGL(@FWaveData, @FFFTData, BB_VisRenderThread.StreamPos);
Dort nehme ich einen pointer was ohne Probleme funktioniert.

Delphi-Quellcode:
function TBASSBoxVis.RenderOpenGL(WaveData, FFT: Pointer;
  MediaPos: Dword): BOOL;
Für wasapi gibt es eine Überladung..
Code:
public extern static int BASS_WASAPI_GetData(IntPtr buffer, int length);
Auch für die andere Funktion könnte ich einen Pointer verwenden
Code:
public extern static int BASS_ChannelGetData(int handle, IntPtr buffer, int length);
Dann wäre ich von der API her der von Delphi schon mal gleich.
Jetzt wäre dann nur noch zu klären was übergebe ich als Pointer.

In Delphi wäre das der Pointer auf TWaveData
In c# mag er das aber nicht wenn ich den Pointer auf die Class WaveData zurück gebe.
Zitat:
Error 1 'MediaPortal.UI.Presentation.Players.WaveData32' is a 'type' but is used like a 'variable' D:\MP 2.0\MediaPortal-2\MediaPortal\Source\UI\Players\BassPlayer\BassPla yer.cs 449 63 BassPlayer

Irgendwie hab ich in C# da kleine Probleme.. kann nur besser werden

gruss

Geändert von EWeiss ( 6. Nov 2014 um 05:33 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#12

AW: Delphi type nach c#

  Alt 6. Nov 2014, 07:07
Zeiger sind in C# verpönt, aber wenn es doch mal sein muss:
Code:
        public WaveData GetWaveData()
        {
            WaveData result = new WaveData();
            BassStream vizStream = _controller.PlaybackProcessor.VizStream;
            if (vizStream == null)
                return result;
            fixed(Int16* p = result.Data)
            {
                IntPtr ptr = (IntPtr)p;
                if (_externalState != PlayerState.Active)
                    return result;
               
                if (BassWasapi.BASS_WASAPI_IsStarted())
                {
                    BassWasapi.BASS_WASAPI_GetData(ptr, 2048);
                }
                else
                {
                    Bass.BASS_ChannelGetData(vizStream.Handle, ptr, 2048);
                }
                return result;
            }
        }
Ist aber ungetestet und ich habe das so noch nicht gemacht.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#13

AW: Delphi type nach c#

  Alt 6. Nov 2014, 07:50
Danke..

Habe es jetzt so gemacht
Code:
    unsafe
    public WaveData32 GetWaveData32()
    {
      WaveData32 result = new WaveData32();
      BassStream vizStream = _controller.PlaybackProcessor.VizStream;
      if (vizStream == null)
        return result;

      fixed (float* p = WaveData32.Data32)
      {
        IntPtr ptr = (IntPtr)p;
        if (_externalState == PlayerState.Active)
        {
          if (BassWasapi.BASS_WASAPI_IsStarted())
          {
            BassWasapi.BASS_WASAPI_GetData(ptr, 2048);
          }
          else
          {
            Bass.BASS_ChannelGetData(vizStream.Handle, ptr, 2048);
          }
        }
        return result;
      }
    }

    unsafe
    public WaveData GetWaveData()
    {
      WaveData result = new WaveData();
      BassStream vizStream = _controller.PlaybackProcessor.VizStream;
      if (vizStream == null)
        return result;

      fixed (Int16* p = WaveData.Data16)
      {
        IntPtr ptr = (IntPtr)p;
        if (_externalState != PlayerState.Active)
          return result;

        if (BassWasapi.BASS_WASAPI_IsStarted())
        {
          BassWasapi.BASS_WASAPI_GetData(ptr, 2048);
        }
        else
        {
          Bass.BASS_ChannelGetData(vizStream.Handle, ptr, 2048);
        }
        return result;
      }
    }

wobei sich das
Code:
fixed(Int16* p = result.Data)
nicht kompilieren lässt.

Nochmal extra für deine Hilfe

gruss

Geändert von EWeiss ( 6. Nov 2014 um 08:06 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#14

AW: Delphi type nach c#

  Alt 6. Nov 2014, 08:10
Wenn er wegen 'unsafe Code' meckert, dann musst du in den Compilereinstellungen was drehen (Eigenschaften des Projekts "Unsicheren Code zulassen"). Dann sollte es gehen. Auch wenn es nervt: Es ist gut, das man solche unsicheren Stellen (Buffer Overrun) im Code explizit markieren muss und sogar dem ganzen Projekt das Attribut "Ich bin unsicher" verpasst.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

AW: Delphi type nach c#

  Alt 6. Nov 2014, 09:04
Wenn er wegen 'unsafe Code' meckert, dann musst du in den Compilereinstellungen was drehen (Eigenschaften des Projekts "Unsicheren Code zulassen"). Dann sollte es gehen. Auch wenn es nervt: Es ist gut, das man solche unsicheren Stellen (Buffer Overrun) im Code explizit markieren muss und sogar dem ganzen Projekt das Attribut "Ich bin unsicher" verpasst.
Das habe ich gemacht unter build Option

Zitat:
"Ich bin unsicher" verpasst.
Ist aber Fies
Ein Code muss nicht schlecht sein weil ich ihm einen Pointer verpasse

Danke.

Geändert von EWeiss ( 6. Nov 2014 um 09:08 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#16

AW: Delphi type nach c#

  Alt 6. Nov 2014, 10:26
Nein.
Unsicher != Schlecht.
Unsicher = Unsicher.

Wenn ich aber in meiner (z.B.Web)anwendung eine unsafe DLL entdecke, dann weiß ich, das ich hier ein potentielles Sicherheitsrisiko habe, was ich genauer unter die Lupe nehmen muss...
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#17

AW: Delphi type nach c#

  Alt 6. Nov 2014, 10:44
Es birgt inhärent Gefahrenquellen, die das Konzept hinter C# eigentlich komplett zu eliminieren sucht. Das ist sogar einer der Design-Basen. Insofern ist es, in der .NET-Welt, durchaus als "schlecht" anzusehen. Ich stolpere aber selbst oft genug über Dinge, wo es anders nicht oder nur mit gewaltigen Performanceeinbußen "richtig" ginge - gerade bei der Nutzung von nicht-.NET Libs - um zu wissen, dass die Praxis einfach noch immer anders spielt als die Theorie idealisiert. Von daher: Gräme dich nicht. Ein Purist würde sicher seine Nase rümpfen, Pragmatiker sehen das anders. Und wer mag schon Puristen
Sauber programmiert ist das alles ja auch okay. Die "unsafe" Marker sollen einen im Prinzip nur daran erinnern, dass hier jetzt bitte wirklich echte große Sorgfalt herrschen soll.
(Ich würde nur nicht anfangen auf diese Weise Dinge zu erledigen, für die C# bzw. .NET ins Framework passende Wege bereit stellt. Man könnte in C# ja durchaus dynamische Arrays genau so wie unter C machen, aber da würde ich dann auch den großen Hammer raus holen und ein bischen auf dem Entwickler damit rumklopfen =))
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#18

AW: Delphi type nach c#

  Alt 6. Nov 2014, 14:25
Na dann
In dem Fall bin ich beruhigt.

gruss
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz