1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-08-05 03:00:25 +00:00
Commit graph

448 commits

Author SHA1 Message Date
Samuel Gomes
d48df65282 Delete copy and move constructors and assignments operators for BufferMap class 2023-01-09 06:02:29 +05:30
Samuel Gomes
8c0590acee Add workaround for _SNDCOPY for sound created using _SNDOPEN(buffer, "memory") 2023-01-09 05:33:39 +05:30
Samuel Gomes
2e176ebf98 Set AUDIO_DEBUG to 0 2023-01-08 00:34:58 +05:30
Samuel Gomes
2957c41061 Workaround for _SNDCOPY for _SNDNEW sounds. Another one to follow for _SNDOPEN(buffer, "memory") 2023-01-08 00:14:59 +05:30
Samuel Gomes
5a893b8ffc Update comments and some beautification 2023-01-06 20:32:03 +05:30
Samuel Gomes
eacee1f609 Add PushMonoSampleFrames 2023-01-06 12:21:17 +05:30
Samuel Gomes
f7690aea17 Update comments 2023-01-02 16:24:08 +05:30
Samuel Gomes
ecfe4fb1be Format code 2023-01-01 23:17:56 +05:30
Samuel Gomes
6c72deafc1 Improve _SNDOPEN test and supress printfs in Hively replayer code 2023-01-01 23:14:05 +05:30
Samuel Gomes
e4273c0a68 Add Amiga AHX & HVL decoder 2023-01-01 22:56:02 +05:30
Samuel Gomes
061bf6af3d Rename _NEWSOUND to _SNDNEW to align with _SND* APIs 2022-12-31 12:00:38 +05:30
Samuel Gomes
da9d9e871c Fix for template argument deduction/substitution failed 2022-12-31 05:18:22 +05:30
Samuel Gomes
4c80f6bcea Implement feature request #28 2022-12-31 01:49:23 +05:30
Samuel Gomes
eebb56afd5 Implement load sound from memory #232 2022-12-22 20:42:27 +05:30
Samuel Gomes
a72f80258f Address #186 2022-12-22 15:11:20 +05:30
Samuel Gomes
bc65076feb Reduce mutex locks by using 2 vectors for _SNDRAW 2022-12-21 11:47:41 +05:30
Samuel Gomes
1357f53041 Add NO_PITCH, NO_SPATIALIZATION flags for raw ma_sound 2022-12-16 12:28:22 +05:30
Samuel Gomes
bcc7105641 Avoid getting queue size inside loop 2022-12-16 03:50:32 +05:30
Samuel Gomes
bd82b24ac7 Improve SOUND timing - #167 2022-12-15 10:47:27 +05:30
Samuel Gomes
df9b739e23 Address #166 - _SNDRAW using miniaudio data source 2022-12-15 09:16:42 +05:30
Samuel Gomes
cf16cb0c00 Replace custom queue code with C++ STL queue 2022-12-13 09:12:52 +05:30
Samuel Gomes
7f2ab7e83a
Merge branch 'QB64-Phoenix-Edition:main' into miniaudio-fixes 2022-12-04 01:32:39 +05:30
Matthew Kilgore
7ac2eefcb8 Fix slowdown of _ScreenX and _ScreenY
The commands _ScreenX and _ScreenY got significantly slower due to the
need to wait for the GLUT thread to wake up and execute the glutGet()
command for them. We've already seen a few programs (including the IDE)
where this behavior completely grinds the program to a halt, so we
definitely can't keep it.

The simple solution here is to not call glutGet() on every _ScreenX/Y
command. Instead every time the idle/timer function runs we get the
current values for the relevant glutGet() variables and store them.
libqb_glut_get() then checks if the value being read is one of the ones
we read in the idle/timer functionand if so just returns the last read
value. By doing it this way the commands no longer has to wait on the
GLUT thread for the result.
2022-11-30 17:33:17 -05:00
Matthew Kilgore
f7fabda198 Fix random seg faults on exit
Fairly straightfowrad, programs were randomly seg faulting on exit. This
was happening due to GLUT registering a cleanup function via atexit(),
which then gets called when exit() is called.

The issue happens when exit() is called on a thread other than the GLUT
thread, which leads to the exit() call then attempting to cleanup GLUT
while the other thread is still using it, which randomly leads to seg
faults.

Fixing this is slightly annoying. We cannot stop the GLUT thread, as
the basic GLUT API (which is used on Mac OS) simply does not offer a way
to exit the glutMainLoop() call. Thus the simplest solution is to simply
make sure we call exit() on the GLUT thread, which we can fairly easily
due via the message queue.

That being the case, a new libqb_exit() API was added, which simply
regsiters the GLUT exit message and then waits for the program to end.
The atexit() handler then runs on the GLUT thread and everything works
out fine.

In the future we probably should redo the exit logic a bit so that all
the threads are actually stopped/joined to ensure the exit process is
consistent, however this is good enough for now. Also, there's plenty of
error states which call exit() which I did not address.
2022-11-29 20:04:54 -05:00
Matthew Kilgore
6c288ecb6f Don't compile libqb.cpp as Objective-C on Mac OS
With the recent changes to libqb.cpp to pull out some of the GLUT logic,
the only actual Objective-C in libqb.cpp was pulled out. That being the
case, it's no longer necessary to have libqb.mm for compiling libqb.cpp,
so we're removing it to simplify the compliation logic a bit.
2022-11-29 20:04:54 -05:00
Matthew Kilgore
72193e34e5 Add GLUT command queue, processed on GLUT thread
This fixes all the code so that all the calls to glut functions
happen on the same thread that is running GLUT.

We achieve this by creating a queue of GLUT commands to execute.
Commands can be added to the queue anywhere in the code, and then the
queue is processed on the GLUT thread via it's idle func or timer func.
The command is run and if necessary the result is provided in the
message queue object. Each object contains a completion which can be
waited on to block until the GLUT thread has processed the command.

Fixes: #66
2022-11-29 20:04:54 -05:00
Matthew Kilgore
d678be717c Move GLUT initialization logic into separate .cpp file 2022-11-29 20:04:53 -05:00
Samuel Gomes
93bf793c19
Merge branch 'QB64-Phoenix-Edition:main' into miniaudio-fixes 2022-11-27 10:58:57 +05:30
Matt Kilgore
8185234792
Merge branch 'main' into fix-glut-init-logic 2022-11-26 22:42:46 -05:00
Roland Heyder
ec6e648007 Simplify #include
Solving #119
2022-11-27 00:11:04 +01:00
Matthew Kilgore
d2aa572a94 Fix GLUT initialization logic
The current GLUT initialization logic is flawed because it allows the
QB64 code portion of the program to start on a separate thread at the
same time that the GLUT code is starting. This results in a race where
some commands won't work for a brief period at the beginning of the
program (with "won't work" being very inconsistent, some return invalid
values, some have a chance at seg faulting).

The same issue also leads to us adding many `while (!window_exists)`
checks in an attempt to solve this race for some of the commands.
Unfortunately this solution is very inconsistently applied leading to
some deadlock situations, and really it's a silly solution when this
race is entirely our creation anyway.

To fix this, the logic was changed such that we perform all of the GLUT
initialization besides calling `glutMainLoop()` before we ever start the
thread that runs the actual QB64 code. By doing it this way we ensure
that the GLUT initialization has already taken place before the code
runs and thus the race is gone.

Things get a bit more interesting with $SCREENHIDE, because that simply
delays the execution of the GLUT initialization indefinitely until
_ScreenShow is done. This was previously very buggy since some commands
rely on FreeGLUT being up and will simply hang the entire program if
run. Other commands have logic to catch this and simply return zero.

The above issue is solved with the `NEEDS_GLUT()` and `OPTIONAL_GLUT()`
macros. Both of them simply check if the GLUT initialization has taken
place and exit the current function if it has not. The difference
between the two is that `NEEDS_GLUT()` throws an 'illegal function call'
error while `OPTIONAL_GLUT()` simply exits with no error. The choice of
behavior of each function was based upon its previous behavior - if it
checked `screen_hide` and exited with no error previously, then
`OPTIONAL_GLUT()` was used. If it deadlocked or similar then
`NEEDS_GLUT()` was used (so instead of deadlocking, it now produces an
error). In this way, programs can now never get stuck due to the use of
`$SCREENHIDE` and all the commands have consistent behavior that can be
relied upon.

Fixes: #234
2022-11-26 01:33:32 -05:00
Samuel Gomes
b29eaed459
Merge branch 'QB64-Phoenix-Edition:main' into miniaudio-fixes 2022-11-26 07:59:30 +05:30
SteveMcNeill
ca7d6ee289 fix comment
Whoops!  Not enough coffee, I guess.  ;)
2022-11-25 00:52:29 -05:00
SteveMcNeill
0d76a7bbed Simplify multi-line logic to single line. 2022-11-24 15:00:54 -05:00
SteveMcNeill
6d055e5df1 Bugfix to _FONT
Fonts 9, 15, and 17 can *only* be used in SCREEN 0.  Attempting to use them in graphic screens results in a seg fault and an instant program crash on Windows.  This is definitely the most undesirable of behaviors for a program, and can easily be caught and dealt with just by tossing a simple "Illegal Function Call" error for the issue.
2022-11-24 08:34:31 -05:00
Samuel Gomes
50c1430456
Merge branch 'QB64-Phoenix-Edition:main' into miniaudio-fixes 2022-11-24 07:17:04 +05:30
Matthew Kilgore
c84220055f Add FreeGLUT warning function
Registering a warning function keeps FreeGLUT from writing warnings to
the console (which is not desirable since it conflicts with our own
console output).
2022-11-22 23:53:04 -05:00
Matthew Kilgore
11a5b8be8e _OpenClient() should return zero on connection failure, not error 2022-11-20 18:44:24 -05:00
Matthew Kilgore
445408d95b _StatusCode() should give the correct error on invalid handle type
Passing a handle of the invalid type (Ex. TCP) to _StatusCode should
give error 52, but it gies error 9.
2022-11-20 04:38:03 -05:00
Matthew Kilgore
12c9c35db5 Add _StatusCode command for HTTP handles
The _StatusCode command returns the status code on the HTTP response
when given a HTTP handle from _OpenClient().
2022-11-20 04:04:02 -05:00
Matthew Kilgore
ffdf9db390 Add libqb.cpp stream support for HTTP
Modifies libqb.cpp to add support for opening HTTP connections via
_OPENCLIENT(). This makes use of the libqb_http API in ./libqb, which is
backed by libcurl.

This also includes a bit of refactoring for some of the code that
required additions. I replaced a few of the integer values with enums,
and added a new entry for Http and then implemented it in all the
necessary locations. In addition to `_OPENCLIENT()`, there is also
support for using HTTP connections with `EOF()`, `LOF()`, `GET #`
(variable and fixed length), and `CLOSE`.

I additionally fixed an issue of parsing the colon parts of the
`_OPENCLIENT()` parameter, where having too many colons would cause the
program to crash. Since we only allow so many parts to begin with it I
simply limited the max number of parts it will split to 10.

Fixes: #98
Fixes: #46
2022-11-19 15:13:26 -05:00
Matthew Kilgore
45d52271da Add libqb_http API for HTTP connections
This adds the libqb_http API, which is designed to support HTTP and
HTTPS usage from QB64-PE source.

The design consists of a single thread which services all the HTTP(s)
connections. There are then various libqb_http APIs exposed that allow
interacting with this thread to create a new connection, query
connection status, read data, or close the connection.

Internally the thread makes use of the curl_multi interface to allow a
single thread to service multiple HTTP(s) connections in parallel. This
means you can _OPENCLIENT() multiple HTTP connection in a row and all of
them will be serviced at the same time in whatever order data is
available.

HTTP is optional and selected via a Makefile setting. A stub is swapped
in if HTTP support is not used, which avoids need to add another build
flag to libqb.cpp.
2022-11-19 15:13:26 -05:00
Samuel Gomes
4c5072e0aa Enable PulseAudio on Linux 2022-11-18 10:46:58 +05:30
Matthew Kilgore
34a7df535e Add libcurl to the repository
This copy is used for building on Windows. For Linux and OS X we used
the system-provided copy.
2022-11-17 22:03:41 -05:00
Samuel Gomes
96e2c92bd6
Merge branch 'QB64-Phoenix-Edition:main' into miniaudio-fixes 2022-11-16 08:13:26 +05:30
Matthew Kilgore
a28342be99 Fix password handling in _InputBox$ on Windows
We were incorrectly treating the empty string and NULL the same and
using a password dialog for both. It now has the correct behavior of
displaying the password when provided the empty string, but just
displaying a blank input box when provided NULL.
2022-11-14 20:23:41 -05:00
Samuel Gomes
5cefba8609 Merge branch 'miniaudio-fixes' of https://github.com/a740g/QB64pe into miniaudio-fixes 2022-11-14 23:46:22 +05:30
Samuel Gomes
ea80bddd51
Merge branch 'QB64-Phoenix-Edition:main' into miniaudio-fixes 2022-11-14 23:33:25 +05:30
Matthew Kilgore
e6964dfc69 Include stdint.h on Windows, change integer defines to use them
It seems we weren't including stdint.h on Windows by mistake. Likely we
were getting it anywy from some other header, but it sounds like that
got changed in newer versions of MinGW and either way we shouldn't rely
on that.

Being that we include stdint.h on all platforms, I also changed os.h to
always use these types when defining the `int32` and friends sized
types. Ideally we get rid of those defines in the future but we can at
least use the stdint.h types going forward (as we already have).
2022-11-12 19:48:26 -05:00
Matthew Kilgore
1509f85719 Improve _InputBox$ support on Windows
This applies various dialog settings so that the dialog is always on
top, and also so that Tab works as expected to move between the
controls. The Edit control is moved first so that it's focused when the
window appears.
2022-11-12 19:48:17 -05:00