środa, 3 sierpnia 2016

Xamarin.Android kontra Java odc.4 (rozwiązanie problemu ze słabym mruganiem świateł w C#)

Hurra! Zagadka #9 Zagadka z wizualizacji z odcinka 2 rozwiązana! Zielona Xamarinowa edycja app-ki mruga już tak samo jak oryginał w Javie. Poprawka wbita na githubie.

WP_20160803_22_35_05_Pro

Co nie grało? Czemu w Javie dokładnie ten sam kod inaczej działał niż w C#?  Zrobiłem sobie logowanie tablicy bajtów z FFT dostarczanych do mojej klasy LightOrganProcessor przez obiekt klasy Visualizer z Android API w projekcie w Javie oraz w C#.

Java:

08-03 19:23:35.166 19561-19561/com.apps.kruszyn.lightorganapp I/sample_LightOrganProce: processFftData 1470245015166: [-8, 0, -5, -1, -8, 0, -14, 2, -13, 17, 24, -13, 11, 10, 13, -3, 4, -8, -1, -4, 3, 3, 4, -3, 0, -5, -1, -2, 1, 0, 3, -2, -2, -4, -2, 0, 0, 1, 2, -1, -1, -3, -2, -2, -1, 0, 1, -1, 0, -3, -3, -1, -1, 0, 0, -1, 0, -2, -2, -1, 0, 0, 0, -1, -1, -2, -2, -1, 0, 0, 0, -1, 0, -1, -1, 0, -1, 0, 1, -1, 0, -2, -1, -1, 0, 0, 0, -1, 0, -1, -1, 0, -1, 0, 0, -1, 0, -1, -1, -1, 0, -1, 0, -1, -1, -1, -1, -1, 0, 0, 0, -1, 0, -2, -1, -1, 0, 0, 0, -1, -1, -2, -2, -2, -3, 0, -1, 0, -2, 2, 0, 0, 0, 0, 0, 1, 0, -1, -1, 0, 0, 0, 1, -1, 0, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, 0, -1, 0, -2, -3, -2, -2, -3, -1, 1, 0, 1, 0, -1, 0, -2, 0, -1, 0, -1, -1, -1, -2, -1, 0, -1, 0, 0, 0, -1, -1, -1, -1, 0, -2, 0, -1, 0, 0, 0, -1, 2, 0, -5, -2, -2, -2, 0, 0, 1, 0, -1, -1, 0, -2, -1, 1, -1, 1, -1, 0, -2, -2, 1, -1, 0, 1, -1, 2, -2, -1, -3, -2, 0, -1, 0, -1, -2, 1, -3, -2, -1, -3, -2, -1, 2, -1, -2, -3, 0, 2, 0, 0, 1, -1, -1, 0, 0, 1, 0, 1, -2, 0, -2, -2, -1, 0, -4, -2, -2, 0, -3, -2, -1, -4, -1, -2, 1, 0, -1, -1, 0, -1, 0, -1, -1, -1, 1, -3, 2, 0, 2, 3, 0, 0, 0, 0, -1, 0, 1, -1, -2, 1, -3, -2, -2, 1, 0, -1, -1, -2, -2, -2, -1, -2, -1, -2, 1, -2, -1, 1, -1, 0, -1, -1, -1, -2, 0, -1, -2, -1, 0, 1, 0, 0, -2, -3, 0, -2, 0, -1, 0, 0, 0, -1, -2, 0, -3, -1, -3, -3, -1, -2, 0, -1, 1, 0, 1, 1, 0, -2, 1, 0, 1, 0, -1, 0, -2, 0, -1, -4, -3, -2, 1, -1, 1, 0, 2, -2, 1, -1, -1, 0, -2, -2, 0, -1, 0, -1, -1, -1, -1, -2, -1, -2, -1, 0, 0, -1, 0, -1, 0, -4, 0, -1, 1, -1, 2, 0, 1, 0, 0, -1, 0, -1, 1, 0, -1, -1, 0, 0, 0, -1, -1, -3, -1, 0, 2, -1, 1, 0, -1, -1, 0, 0, 0, 0, 1, -1, -1, -1, -1, -2, 2, 0, 0, 0, -2, -2, -1, -2, 1, 0, -1, -1, -1, -2, -1, 1, 0, -1, 0, -1, 0, 0, 0, -1, 1, -2, 0, -1, 1, 0, 2, -1, 0, -1, 1, 0, -1, -1, -1, -2, 1, 0, 1, 0, 1, 1, 0, -1, 1, 0, -1, -1, -2, -1, 0, -1, 0, -1, 0, 0, 1, 2, 1, -2, 2, 2, -2, 0, -2, -2, -1, -1, 0, 0, -1, 0, 0, 0, -1, 0, -1, -2, 1, 0, -1, 0, 0, 1, 0, -1, 1, -2, 0, -1, 0, -1, 2, 1, 0, -1, -1, -1, 0, 1, 0, 1, 0, 0, -1, -1, -1, -1, 0, -1, 1, 0, 1, 1, 1, 2, 0, 0, 0, -1, -1, 1, 0, 1, -1, 0, -2, -1, -2, -2, 0, -1, 2, 1, 1, 2, -1, 0, -2, -3, -1, -1, -1, 0, 0, 0, 0, 0, 0, 1, 1, 1, -1, 0, -1, 0, 0, -2, -1, -1, 0, 0, 0, -1, 0, -1, 1, 1, 0, 1, 0, 1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 1, -1, -1, -1, 0, 0, -1, 0, -1, 0, 0, 0, 1, -1, 0, -2, -2, -2, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 1, -1, -2, -2, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, -1, 0, -2, 0, 1, 0, -1, -1, 0, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, 0, -1, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, -1, 0, -1, -1, 0, -1, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 0]

C#:

08-03 19:47:04.625 I/sample_LightOrganProce(22658): processFftData 1470246424618: [2, 0, 0, 251, 249, 1, 1, 15, 19, 14, 241, 215, 12, 242, 254, 241, 250, 249, 253, 0, 2, 249, 0, 252, 255, 254, 1, 255, 2, 254, 2, 255, 0, 250, 254, 253, 0, 254, 0, 254, 0, 253, 255, 253, 255, 254, 255, 254, 255, 255, 0, 255, 0, 255, 0, 254, 255, 254, 255, 255, 0, 255, 0, 254, 0, 254, 255, 254, 255, 255, 255, 254, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 254, 1, 254, 0, 255, 0, 254, 255, 255, 0, 254, 255, 255, 255, 255, 0, 255, 0, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 255, 255, 0, 255, 0, 255, 0, 0, 255, 254, 0, 255, 1, 255, 2, 1, 254, 1, 0, 0, 255, 1, 0, 1, 0, 1, 255, 0, 254, 0, 255, 0, 255, 0, 0, 255, 0, 1, 255, 0, 1, 0, 0, 3, 255, 0, 253, 255, 0, 253, 255, 1, 2, 0, 255, 0, 255, 3, 0, 255, 1, 1, 255, 0, 254, 254, 0, 0, 255, 255, 0, 1, 2, 3, 1, 2, 253, 2, 254, 255, 255, 1, 255, 0, 255, 254, 250, 0, 254, 255, 254, 2, 254, 254, 253, 252, 2, 2, 2, 1, 254, 0, 1, 1, 0, 1, 254, 1, 0, 1, 253, 0, 0, 0, 2, 4, 250, 0, 253, 254, 254, 2, 255, 0, 253, 255, 252, 254, 252, 251, 253, 254, 8, 255, 255, 255, 1, 255, 0, 4, 254, 2, 253, 255, 252, 252, 253, 253, 254, 0, 255, 0, 0, 254, 252, 252, 0, 0, 3, 2, 0, 0, 0, 1, 255, 3, 2, 3, 255, 2, 254, 254, 254, 0, 254, 255, 254, 255, 2, 253, 255, 254, 253, 2, 0, 2, 0, 0, 1, 1, 255, 1, 0, 255, 252, 254, 254, 0, 255, 0, 253, 253, 254, 254, 0, 255, 0, 255, 0, 254, 255, 252, 255, 254, 255, 0, 0, 253, 1, 255, 0, 1, 255, 0, 255, 254, 0, 254, 1, 4, 1, 1, 0, 0, 1, 1, 254, 255, 253, 253, 254, 253, 2, 1, 5, 5, 1, 2, 254, 1, 252, 0, 1, 2, 253, 255, 1, 0, 1, 0, 255, 3, 255, 2, 1, 1, 0, 1, 0, 2, 2, 3, 254, 1, 252, 0, 254, 1, 254, 2, 251, 255, 254, 254, 253, 253, 255, 254, 4, 1, 255, 0, 255, 255, 255, 2, 254, 255, 254, 0, 0, 0, 0, 0, 3, 1, 254, 1, 0, 253, 255, 255, 0, 255, 0, 254, 255, 1, 0, 0, 1, 2, 255, 1, 0, 255, 255, 254, 1, 253, 1, 0, 3, 2, 2, 1, 255, 255, 254, 255, 0, 255, 2, 2, 253, 2, 253, 0, 254, 255, 255, 254, 254, 255, 254, 2, 1, 0, 255, 254, 255, 254, 0, 255, 1, 1, 0, 1, 255, 0, 3, 1, 255, 255, 255, 254, 255, 254, 0, 2, 254, 0, 255, 255, 0, 0, 1, 1, 0, 255, 1, 2, 254, 0, 254, 253, 253, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 254, 0, 0, 0, 255, 0, 253, 0, 2, 3, 255, 254, 1, 253, 1, 0, 0, 1, 1, 1, 1, 255, 255, 255, 0, 1, 1, 0, 2, 255, 0, 253, 255, 254, 255, 0, 255, 255, 0, 255, 255, 255, 0, 255, 0, 254, 1, 2, 0, 254, 254, 0, 0, 0, 255, 1, 2, 1, 2, 255, 0, 253, 254, 253, 253, 255, 255, 1, 1, 0, 2, 254, 1, 253, 253, 0, 2, 255, 0, 254, 255, 1, 0, 1, 1, 0, 1, 255, 1, 254, 0, 254, 255, 255, 255, 2, 1, 1, 3, 255, 255, 254, 254, 255, 255, 0, 1, 255, 0, 253, 255, 255, 0, 2, 1, 2, 1, 255, 2, 254, 0, 0, 0, 255, 1, 255, 253, 254, 254, 255, 255, 0, 1, 1, 2, 255, 0, 253, 0, 253, 255, 255, 255, 254, 0, 255, 0, 254, 254, 0, 1, 254, 255, 255, 0, 0, 0, 254, 255, 255, 253, 1, 254, 1, 0, 1, 1, 0, 0, 255, 255, 255, 255, 255, 0, 255, 0, 255, 255, 255, 255, 255, 0, 255, 0, 255, 255, 255, 0, 255, 0, 255, 0, 255, 255, 255, 255, 255, 0, 255, 0, 255, 0, 255, 255, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 255, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 255, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 255, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 0, 0, 0, 0, 255, 0, 255

Podczas portowania wkradła się szkolna pułapka (kiedyś na studiach gdy Java rozmawiała z C++ przez sockety stało się podobnie….). Pułapką była zbytnia wierność kodu w C# w stosunku do kodu w Javie, w sumie to mapowanie API w Xamarinie z Javy na C# ma trochę za uszami. Przecież byte w Javie to NIE TO SAMO co byte w C#, po dwakroć, po trzykroć!  W Javie byte jest signed, podczas gdy w C# jest unsigned.

image

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

image

https://msdn.microsoft.com/en-us/library/5bdb6693.aspx

W C# bajtem unsigned jest sbyte.

image

https://msdn.microsoft.com/en-us/library/d86he86x.aspx

Xamarin zwraca nam z Android API tablicę byte[] zamiast sbyte[]. Jak dokonam rzutowania bajtu w C# (powstałego z bajtu w Javie) na sbyte, to powrócę do tego, co było w Javie.

Po zastosowaniu poprawki:

    public class LightOrganProcessor
    {
        …

        public void ProcessFftData(Visualizer visualizer, byte[] fft, int samplingRate)
        {

            …
             //bass

            …
            while (nextFrequency < LowFrequency)
            {
                energySum += (int)GetAmplitude((sbyte)fft[k], (sbyte)fft[k + 1]);
                k += 2;
                nextFrequency = ((k / 2) * sampleRate) / (captureSize);
            }
            …


            //mid
            …

            while (nextFrequency < MidFreguency)
            {
                energySum += (int)GetAmplitude((sbyte)fft[k], (sbyte)fft[k + 1]);
                k += 2;
                nextFrequency = ((k / 2) * sampleRate) / (captureSize);
            }
            …


            //treble
            …

            while ((nextFrequency < HighFrequency) && (k < fft.Length))
            {
                energySum += (int)GetAmplitude((sbyte)fft[k], (sbyte)fft[k + 1]);
                k += 2;
                nextFrequency = ((k / 2) * sampleRate) / (captureSize);
            }
           …
        }

        private static double GetAmplitude(sbyte r, sbyte i)
        {
            return Math.Sqrt(r * r + i * i);
        }

       …

    }

mruganie świateł wraca w Xamarinie do normy Winking smile

Brak komentarzy: