Commit Graph

1246 Commits (082e1bff02212d352f0e25839688f9cec3d4cb88)

Author SHA1 Message Date
Jim 88e4e7f1be Merge pull request #49 from fryshorts/linux-input
linux input plugins for desktop and audio capture
2014-03-11 10:07:09 -07:00
jp9000 afc798f712 Also make sure the mutex unlocks
Otherwise deadlock
2014-03-11 09:16:16 -07:00
jp9000 c09a2efc3c FFmpeg plugin: Add a few checks to be safe
Make sure it locks the write mutex before freeing the packets, and put
the detach code in the main thread loop rather than off in a separate
function for clarity
2014-03-11 09:14:21 -07:00
fryshorts 32c8cd00c5 Fixed usage of event functions
The event functions got renamed in obs.
2014-03-11 14:16:03 +01:00
fryshorts c0ab8fadda moved and split up the linux xshm and pulseaudio capture plugins 2014-03-11 14:06:10 +01:00
fryshorts f28912101e Use default pulse audio frame format for recording
We use the default format to avoid any resampling by pulse audio,
since obs will probably resample anyways if necessary.
2014-03-11 14:01:10 +01:00
fryshorts ce9db65695 changed to kernel formatting and added some more documentation 2014-03-11 14:01:10 +01:00
fryshorts 63d441e182 added functions to translate obs settings to pulse 2014-03-11 14:01:10 +01:00
fryshorts f13ae77e00 disable blending for desktop capture 2014-03-11 14:01:10 +01:00
fryshorts 47a6f54910 use pa_mainloop_iterate instead of own implementation
pulse audio provides it's own convenience function to
iterate the mainloop, no need to use a custom one.
pulseaudio provides timing information for the stream, we use
that instead of system time.
2014-03-11 14:01:10 +01:00
fryshorts 9095ad0a00 reformatted source to kernel style 2014-03-11 14:01:10 +01:00
fryshorts 09a75c5394 fixed warnings 2014-03-11 14:01:10 +01:00
fryshorts c558a7b6fa Removed unnecessary buffer
Instead of copying the data from pulse to a local buffer and
then push it to obs, the pointer from pulse is now used and
pa_stream_drop() called afterwards.
2014-03-11 14:01:10 +01:00
Ziemas e67d7607e4 In the API update the diffuse effect got renamed to image. 2014-03-11 14:01:10 +01:00
fryshorts 42bc5eddbb added initial pulse audio input plugin
- first try at implementing a pulse audio input plugin,
  it is currently completely untested.

- added license headers to source files
2014-03-11 14:01:10 +01:00
fryshorts c00d9e3b4e Moved screen grabber code to _tick function
Moved the screen grabbing and texture generation to the
_tick function in order to keep _render fast.
Migrated xshm video source to the new plugin api.
2014-03-11 14:01:09 +01:00
fryshorts 820de55ae2 Added initial Mouse pointer lib
Added library to get the mouse pointer with the XFixes
extension and draw it via a sprite.
2014-03-11 14:01:09 +01:00
fryshorts 12e1855ebc added linux test module with first implementation of a screengrabber using the xshm extension for x11 2014-03-11 14:01:09 +01:00
jp9000 3aedfdfb73 Fix wrong linux function
Used the mac function instead by accident
2014-03-10 19:27:59 -07:00
jp9000 5e1cac68f4 Fix semaphore mac code and mac plugin
Didn't convert the event names and didn't have the right mac includes
2014-03-10 19:24:09 -07:00
jp9000 c023ef69ea Fix non-windows event code
And remember to compile on non-windows systems before committing
2014-03-10 19:08:42 -07:00
jp9000 585fd8f969 Fix audio streaming and mac semaphores
...The reason why audio didn't work was because I overwrote the bitrate
values.

As for semaphores, mac doesn't support unnamed semaphores without using
mach semaphores.  So, I just implemented a semaphore wrapper for each
OS.
2014-03-10 19:04:00 -07:00
jp9000 faabeff743 Allow file names to be used instead of URLs 2014-03-10 14:48:17 -07:00
jp9000 9a07f9b875 Fix minor warning (redundant code) 2014-03-10 14:00:53 -07:00
jp9000 806837873a CoreAudio: fix properties for input/output
Also, check that audio devices are available before setting defaults
2014-03-10 13:59:15 -07:00
jp9000 03fc5b92b3 Ensure URL and key are valid if trying to stream 2014-03-10 13:46:28 -07:00
jp9000 5288467aeb Ensure names are valid
Ensure that a source has a valid name.  Duplicates aren't a big deal
internally, but sources without a name are probably something that
should be avoided.  Made is so that if a source is programmatically
created without a name, it's assigned an index based name.

In the main basic-mode window, made it check to make sure the name was
valid as well.
2014-03-10 13:39:51 -07:00
jp9000 35e7a2a9fe Fix a few warnings 2014-03-10 13:23:28 -07:00
jp9000 02a07ea0a0 Add preliminary streaming code for testing
- Add some temporary streaming code using FFmpeg.  FFmpeg itself is not
   very ideal for streaming; lack of direct control of the sockets and
   no framedrop handling means that FFmpeg is definitely not something
   you want to use without wrapper code.  I'd prefer writing my own
   network framework in this particular case just because you give away
   so much control of the network interface.  Wasted an entire day
   trying to go through FFmpeg issues.

   There's just no way FFmpeg should be used for real streaming (at
   least without being patched or submitting some sort of patch, but I'm
   sort of feeling "meh" on that idea)

   I had to end up writing multiple threads just to handle both
   connecting and writing, because av_interleaved_write_frame blocks
   every call, stalling the main encoder thread, and thus also stalling
   draw signals.

 - Add some temporary user interface for streaming settings.  This is
   just temporary for the time being.  It's in the outputs section of
   the basic-mode settings

 - Make it so that dynamic arrays do not free all their data when the
   size just happens to be reduced to 0.  This prevents constant
   reallocation when an array keeps going from 1 item to 0 items.  Also,
   it was bad to become dependent upon that functionality.  You must now
   always explicitly call "free" on it to ensure the data is free, and
   that's how it should be.  Implicit functionality can lead to
   confusion and maintainability issues.
2014-03-10 13:10:35 -07:00
jp9000 b2202c4843 UI: Swap audio slots
Had the audio restart slot connected to things that didn't require a
restart
2014-03-07 22:34:49 -07:00
jp9000 a9f5959b3c Fix an error and a few warnings
The strings didn't have ending double quotes.  No clue why this didn't
fail in GCC and VC.  Well, VC is horrible but I expected better out of
GCC.
2014-03-07 17:19:26 -07:00
jp9000 f2ee950746 Activate user-selected audio devices
- Fix a bug where the initial audio data insertion would cause all
   audio data to unintentionally clear (mixed up < and > operators, damn
   human error)

 - Fixed a potential interdependant lock scenario with channel mutex
   locks and graphics mutex locks.  The main video thread could lock the
   graphics mutex and then while in the graphics mutex could lock the
   channels mutex.  Meanwhile in another thread, the channel mutex could
   get locked, and then the graphics mutex would get locked, causing a
   deadlock.

   The best way to deal with this is to not let mutexes lock within
   other mutexes, but sometimes it's difficult to avoid such as in the
   main video thread.

 - Audio devices should now be functional, and the devices in the audio
   settings can now be changed as desired.
2014-03-07 17:03:34 -07:00
jp9000 2c3a3f4e65 WASAPI: Change some errors messages to warnings
There shouldn't be errors if the actual source has successfully been
created, just warnings.
2014-03-07 13:04:38 -07:00
jp9000 fd579fe7f4 Make audio devices save to settings
Also, revamp the settings dialog code and make it use signals and slots
a bit better.
2014-03-07 12:56:31 -07:00
jp9000 e8044d0868 Use only one widget for preview
Modify the obs_display API so that it always uses an orthographic
projection that is the size of the display, rather than OBS' base size.
Having it do an orthographic projection to OBS' base size was silly
because it meant that everything would be skewed if you wanted to draw
1:1 in the display.  This deoes mean that the callbacks must handle
resizing the images, but it's worth it to ensure 1:1 draw sizes.

As for the preview widget, instead of making some funky widget within
widget that resizes, it's just going to be a widget within the entire
top layout.  Also changed the preview padding color to gray.
2014-03-07 10:19:03 -07:00
jp9000 7d48dbb1dc Add a way to get default settings
- Implement a means of obtaining default settings for an
   input/output/encoder.  obs_source_defaults for example will return
   the default settings for a particular source type.

 - Because C++ doesn't have designated initializers, use functions in
   the WASAPI plugin to register the sources instead.
2014-03-07 06:55:21 -07:00
jp9000 e88ee06310 Move basic mode configuration to a separate file
Having everything in global.ini meant that if you wanted different
settings for studio mode, that it would also overwrite it for basic
mode.  This way, the settings for each mode are separate, and you can
use different settings for each mode.
2014-03-06 21:08:12 -07:00
jp9000 9fb83cc233 Fixed basic settings window (forgot linux)
The function would fail to compile on linux because the variables didn't
exist
2014-03-06 12:05:19 -07:00
jp9000 2448d0f229 Load up the lists of audio devices in settings
It will now load up a the list of audio input/output devices in the
combo boxes in audio settings.
2014-03-06 07:02:25 -07:00
jp9000 4f7ab552df Reimplement monitor capture
- Implement windows monitor capture (code is so much cleaner than in
   OBS1).  Will implement duplication capture later

 - Add GDI texture support to d3d11 graphics library

 - Fix precision issue with sleep timing, you have to call
   timeBeginPeriod otherwise windows sleep will be totally erratic.
2014-03-05 10:43:14 -07:00
jp9000 3415960d02 WASAPI: Check the HRESULT values with FAILED
I can't believe I did !res there.  Well I suppose I can believe it, but
still.
2014-03-04 07:18:24 -07:00
jp9000 bec8a09bd9 CoreAudio: Separate enumeration code
The enumeration code being up at the top was making things quite messy,
so I split that code out to a separate set of files.
2014-03-04 07:10:33 -07:00
jp9000 348588254c Add WASAPI audio capture
- Add WASAPI audio capture for windows, input and output

 - Check for null pointer in os_dlopen

 - Add exception-safe 'WinHandle' and 'CoTaskMemPtr' helper classes that
   will automatically call CloseHandle on handles and call CoTaskMemFree
   on certain types of memory returned from windows functions

 - Changed the wide <-> MBS/UTF8 conversion functions so that you use
   buffers (like these functions are *supposed* to behave), and changed
   the ones that allocate to a different naming scheme to be safe
2014-03-04 07:07:13 -07:00
jp9000 2fd57ed7f5 CoreAudio: Don't reconnect if no output devices
Somehow this code didn't get included with the last commit.
2014-03-03 05:12:58 -07:00
jp9000 91644fbf23 CoreAudio: Fail if no output device found
Also, don't have it repeat trying to reconnect if no devices are found
2014-03-03 03:21:00 -07:00
jp9000 9c6da6f52d Split output/input audio capture sources
- Split input and output audio captures so that they're different
   sources.  This allows easier handling and enumeration of audio
   devices without having to do some sort of string processing.

   This way the user interface code can handle this a bit more easily,
   and so that it doesn't confuse users either.  This should be done for
   all audio capture sources for all operating systems.  You don't have
   to duplicate any code, you just need to create input/output wrapper
   functions to designate the audio as input or output before creation.

 - Make it detect soundflower and wavtap devices as mac "output" devices
   (even though they're actually input) for the mac output capture, and
   make it so that users can select a default output capture and
   automatically use soundflower or wavtap.

   I'm not entirely happy about having to do this, but because mac is
   designed this way, this is really the only way to handle it that
   makes it easier for users and UI code to deal with.

   Note that soundflower and wavtap are still also designated as input
   devices, so will still show up in input device enumeration.

 - Remove pragma messages because they were kind polluting the other
   compiler messages and just getting in the way.  In the future we can
   just do a grep for TODO to find them.

 - Redo list property again, this time using a safer internal array,
   rather than requiring sketchy array inputs.  Having functions handle
   everything behind the scenes is much safer.

 - Remove the reference counter debug log code, as it was included
   unintentionally in a commit.
2014-03-03 02:56:54 -07:00
jp9000 b4ef6cee91 Remove categories from properties
Categories added an unnecessary complexity to making properties, and
would very likely almost never be used in most cases, and were more of a
display feature.  The main issue is that it made property data more
complex to work with, and I just didn't feel comfortable with that.

Also, added a function to allow you to retrieve a porperty just by its
name.
2014-03-02 21:19:44 -07:00
jp9000 f91b4ef98e Check for duplicate names (function parser) 2014-03-02 19:44:22 -07:00
jp9000 9db52da6a1 Fix non-VS compile issues
As usual, microsoft treats all enums as integers, rather than actually
even checking the enum type.  Worthless compiler.  Just complete
garbage.
2014-03-02 07:41:55 -07:00
jp9000 1eeece5b97 Simplify and improve 'list' property
When a source/output/etc has a property of a 'list' type, there was no
way to get the names associated with its values.  That, and it only
supported lists of either text, or enums (0..[value] only).

Now, you can associate translated names with those values, and use
integer, float, or string values.  Put it all in to one function as well
to simplify its usage.

I plan on using this to help get enumerations from devices/etc for
certain types of sources.  For example, if I get the properties of an
audio source, I'd like to have a list of available devices with it as
well.
2014-03-02 06:32:47 -07:00