Add a few missing equality operators to Input structs.

Add equality operators and Object.Equals() overrides to the
GamePadButtons, GamePadDPad, GamePadThumbSticks, and GamePadTriggers
structs in the MonoGame.Framework.Input namespace.
Make SoundEffect.Play not throw an exception on iOS if it fails to play, return false instead as we are meant to.
Implement TryPlay on other platforms.
Fix playing multiple music tracks, previously when the first one finished we'd play the second which would reset the queue.
Fix android song end detection. _androidPlayer is static but wasn't being correctly treated like it was.

Also fix Duration and Position properties (milliseconds not seconds)
Remove _initialized check from DrawableGameComponent.GraphicsDevice

Initially i put the check there as was implemented by @Aztherion.

I did some testings and found that XNA doesn't enforce any similar test.
After all GraphicsDevice is already initialized by Game. It's logical
that someone might want to do some non-content initialization on the
constractor of DrawableGameComponent based on values from
GraphicsDevice.
Merge remote-tracking branch 'upstream/develop' into nKast_DrawableGameComponent_GraphicsDevice
Merge remote-tracking branch 'upstream/develop' into nKast_DrawableGameComponent_GraphicsDevice
fix for VertexBuffer.GetData<>()

-Argument check now throws exceptions/Messages same as XNA.
-Copy now copies only as many as elementCount items.
-Use of offsetInBytes argument.

I accidentally deleted the branch. Original thread at
https://github.com/mono/MonoGame/pull/2033
--------------

Issue:
https://github.com/mono/MonoGame/issues/1076#issuecomment-24449713

I made some quick testing to see if this behaves as XNA.
https://github.com/mono/MonoGame/issues/2032

Here is the tests I used.
private VertexBuffer _vertexBuffer;
private DynamicVertexBuffer _dynamicVertexBuffer;
VertexPositionColor[] _vertices;

private void SetUpVertexBuffers()
{
//setup
_vertexBuffer = new VertexBuffer(this.Game.GraphicsDevice,
VertexPositionColor.VertexDeclaration, 2, BufferUsage.None);
_dynamicVertexBuffer = new DynamicVertexBuffer(this.Game.GraphicsDevice,
VertexPositionColor.VertexDeclaration, 2, BufferUsage.None);
_vertices = new VertexPositionColor[2];
_vertices[0].Position = new Vector3(11f, 12f, 13f);
_vertices[1].Position = new Vector3(21f, 22f, 23f);
_vertices[0].Color = Color.FromNonPremultiplied(127, 63, 31, 255);
_vertices[1].Color = Color.FromNonPremultiplied(15, 7, 3, 255);
}

private void TestVertexBuffer()
{
VertexPositionColor[] output;
Vector3[] outputvec3;
Vector2[] outputvec2;
float[] outputZ;
Color[] outputColor;
int vertexPCStride = VertexPositionColor.VertexDeclaration.VertexStride;

//copy all
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
output = new VertexPositionColor[2];
_vertexBuffer.GetData(output);
Debug.Assert(output[0].Position == _vertices[0].Position);
Debug.Assert(output[0].Color == _vertices[0].Color);
Debug.Assert(output[1].Position == _vertices[1].Position);
Debug.Assert(output[1].Color == _vertices[1].Color);

//copy only first vertex in first position
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
output = new VertexPositionColor[2];
_vertexBuffer.GetData(output, 0, 1);
Debug.Assert(output[0].Position == _vertices[0].Position);
Debug.Assert(output[0].Color == _vertices[0].Color);
Debug.Assert(output[1].Position == Vector3.Zero);
Debug.Assert(output[1].Color == Color.Transparent);

//copy first vertex in first position
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
output = new VertexPositionColor[1];
_vertexBuffer.GetData(output, 0, 1);
Debug.Assert(output[0].Position == _vertices[0].Position);
Debug.Assert(output[0].Color == _vertices[0].Color);

//copy first vertex in second position
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
output = new VertexPositionColor[2];
_vertexBuffer.GetData(output,1,1);
Debug.Assert(output[0].Position == Vector3.Zero);
Debug.Assert(output[0].Color == Color.Transparent);
Debug.Assert(output[1].Position == _vertices[0].Position);
Debug.Assert(output[1].Color == _vertices[0].Color);

//copy second vertex in first position
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
output = new VertexPositionColor[1];
_vertexBuffer.GetData(vertexPCStride, output, 0, 1, vertexPCStride);
Debug.Assert(output[0].Position == _vertices[1].Position);
Debug.Assert(output[0].Color == _vertices[1].Color);

//copy second vertex in second position
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
output = new VertexPositionColor[2];
_vertexBuffer.GetData(vertexPCStride, output, 1, 1, vertexPCStride);
Debug.Assert(output[0].Position == Vector3.Zero);
Debug.Assert(output[0].Color == Color.Transparent);
Debug.Assert(output[1].Position == _vertices[1].Position);
Debug.Assert(output[1].Color == _vertices[1].Color);

//read positions
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
outputvec3 = new Vector3[2];
_vertexBuffer.GetData(0, outputvec3, 0, 2, vertexPCStride);
Debug.Assert(outputvec3[0] == _vertices[0].Position);
Debug.Assert(outputvec3[1] == _vertices[1].Position);

//read positions 2D
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
outputvec2 = new Vector2[2];
_vertexBuffer.GetData(0, outputvec2, 0, 2, vertexPCStride);
Debug.Assert(outputvec2[0].X == _vertices[0].Position.X);
Debug.Assert(outputvec2[0].Y == _vertices[0].Position.Y);
Debug.Assert(outputvec2[1].X == _vertices[1].Position.X);
Debug.Assert(outputvec2[1].Y == _vertices[1].Position.Y);

//read depth
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
outputZ = new float[2];
_vertexBuffer.GetData(sizeof(float) * 2, outputZ, 0, 2, vertexPCStride);
Debug.Assert(outputZ[0] == _vertices[0].Position.Z);
Debug.Assert(outputZ[1] == _vertices[1].Position.Z);

//read colors
SetUpVertexBuffers();
_vertexBuffer.SetData(_vertices);
outputColor = new Color[2];
_vertexBuffer.GetData(sizeof(float)*3, outputColor, 0, 2,
vertexPCStride);
Debug.Assert(outputColor[0] == _vertices[0].Color);
Debug.Assert(outputColor[1] == _vertices[1].Color);

return;
}
Merge remote-tracking branch 'upstream/develop' into nKast_DrawableGameComponent_GraphicsDevice
Merge remote-tracking branch 'upstream/develop' into tnc_Fix_VertexBuffer_GetData
Make SpriteBatch.DrawString() an atomic operation.

Basically, if SpriteSortMode is "Immediate", only flush after
an entire SpriteFont.DrawInto() call, not after each character.

Reduces number of draw calls by ~90% in some text-heavy scenes,
without (as far as I can tell) diverging from the Xna spec. Doesn't
seem to break anything in the MonoGame tests, either!
Added ScissorRectangle reset after render target change
Make Texture2D.Reload(Stream) public -- again

Someone already did this in a previous commit ( https://github.com/mono/MonoGame/commit/06f6c2fe65201fd3552af1261711af07fbc51cf3 ) but I think it inadvertently got lost in a merge...
I'm not sure why nobody missed it, but my team and I are using this method on Android, to recover from the GraphicsDevice.DeviceReset event. To quote the original commit message:

"The ContentManager class handles texture reloading of all its loaded textures, but if you're using Texture2D.FromStream() to load textures, this change will allow you to reload them without updating their references everywhere."
Merge pull request #2093 from kfazi/scissor_issue

Added ScissorRectangle reset after render target change
Merge pull request #2087 from sulix/spritefont-fix

Make SpriteBatch.DrawString() an atomic operation.
Update Libs to SharpDX 2.5.
Merge pull request #2058 from danzel/fix-mediaplayer-queue

Fix playing multiple music tracks from a collection
Merge pull request #2056 from danzel/fix-ios-audio-crash

Fix SoundEffect.Play return value and iOS/Mac crash
Merge pull request #2046 from PrecisionMojo/_pm/add-missing-input-equality

Add a few missing equality operators to Input structs.