Abosen: A Windows time telling software

Published on February 16, 2013 at 22:29 GMT Share: Twitter | Facebook

A native Windows time telling software that announces the current time at predefined time intervals. (Scheduling options are also available.) The multilingual application comes with a default built-in language, namely, English, but one can download and install more languages via the language pack extensions.
A system tray application that periodically tells you the time

Abosen Time Teller is a free and open source Windows time telling application that announces the current time in Ghanaian languages. ("Abosen" is a transliteration of an Akan expression that literally means "What is the time?") The software comes with a default built-in language, namely, English, but one can download and install more languages via the language pack extensions. This page is the official destination to download both the source code and the installer. If you find any bugs in the software while using it, please report it to me.

In the following paragraphs, I will attempt to explain the various features that are built into the software and how they may be used. Further succeeding these will be how to install and build language pack extensions for the Abosen Time Teller host application.


Abosen Time Teller is designed from the start to be just a time telling application and nothing more than that. I use it myself because I occasionally miss what time it is, especially when I am having a "good time" on my PC. Below are some highlights of the core features the software comes with. I am sure that you will uncover some other features that are not documented here as you continue to use it. The features described here are based on the built-in language, English (Default). Thus, the labels described here may be different in your selected language pack.

  • Multilingual

    Abosen Time Teller is designed to support unlimited number of languages. You can add more languages to it even after installation. This allows you to choose the language of your choice. However, the software comes with only a single built-in language, namely, English. You can change the language you want by browsing the Language drop-down menu in the Preferences window. The languages you would see are those that you have installed.

  • Varied voices

    Why have Johnny say the time when you would actually prefer Sandy to do so? Abosen Time Teller allows you to do just so. The voice you select will be the voice that will tell you the time. However, note that the types of voices available is dependent upon the selected language. For example, if you select English (Default) as the active language, only Robot voice would be available to select. The voices are contained within the language packs themselves. You can change the active voice by browsing the Voice drop-down menu in the Preferences window.

  • Automatic mode

    This mode allows you to get notified, starting from a specific time, every X minutes or hours, what time it is. Under the Automatic section, you can select the Start Time, which determines the time you want the time telling routine to begin. For example, if you don't want to hear the time after midnight but only from 8 o'clock in the morning onward, then you may set the start time to 8:00 AM. After choosing the start time, which by default is set at 12:00 AM, you may also set the interval. The interval may be between 1 and 59 minutes, or 1 and 24 hours. The interval determines the period of time between each announcement.

  • Schedule mode

    The application installs in Automatic mode by default but that may not suit all kinds of people. How about you, one who wants to get time notifications between arbitrary intervals? Then the Schedule mode is the one for you. You will get notified at the specified times you have explicitly scheduled only. The Add button allows you to add a new time to the schedule while the Remove button does the opposite. When you click on the Add button, a small dialog box will appear which will allow you to input the new time to schedule.

  • Autostart option

    By default, Abosen Time Teller installs with this option enabled. This feature allows the program to start automatically whenever Windows starts. You may turn this feature on or off by right-clicking the application's icon in the notification area on the taskbar, and then selecting Autostart from the popup menu. If Autostart is enabled, you will see a check mark in front of the menu item. If not, no check mark will be present. If this feature is disabled, you will have to manually launch the application every time Windows starts and you want to use it.

  • Silent mode

    You can mute the application by setting it to the silent mode. This is especially useful when you want to play a game or just don't want to hear the time notification sound buzz in your ears, yet would like it to have it running in the background. To enable this option, locate the shell icon in the notification area of the taskbar, right-click the icon and select Silent. That's it! From then on you will not hear any time notifications till you turn it back off. However, if you should open the Preferences window and click the Tell Time button, the application will ignore this setting and proceed to tell the time.

Language packs

Abosen Time Teller comes with only a single built-in language, namely, English (Default). All other languages you may wish to install should be downloaded separately as language packs. However, there are some builds available that contain some additional language packs already. The language packs are just Windows Dynamic Link Libraries (DLLs) which contain resources that determine the user interface textual content, time telling voices, etc. If you wish to build your own language pack, then have a look at the Building a language pack section below.

Installing a language pack

To install an Abosen Time Teller language pack, all you have to do is download the pack and place the DLL file in the same directory as the application. For example, if you installed the application to the location "C:\Program files\MetaGhana\Abosen", then drop the DLL file in that same folder. Note that you will need to restart the application in order to read the newly installed language pack. If the installed language is still not showing up in the application, chances are the DLL is not a valid language pack. Contact the author of such DLL for further assistance.

Building a language pack

If you are a programmer and wish to build your own language pack, then the first thing you must do is to grab the common.h header file, which is already included in the project source code. The said file contains a RESOURCE structure you MUST implement and some predefined constants (optional) to get you started. You may write the DLL in C (the prefered choice), C++ or any other language that can expose the required functions, and interface with the host application. If you decide to write a pack in C++, however, you should do well to take note of the name mangling quirks associated with it. Even so, I hear there are several workarounds to that.

An Abosen Time Teller language pack is required to fill all members of the RESOURCE struct (except hInstance). Failure to do so might result in application crashes or some undefined behavior. Also the DLL must be built in Unicode mode by defining UNICODE (and _UNICODE if you use any of the C runtime libraries in your code). This is how the structure looks like:

typedef struct _RESOURCE {
   PTCHAR pzLanguage;
   PTCHAR *paVoices;
   int nVoicesCount;
   PTCHAR pzActiveVoice;
   HINSTANCE hInstance;

Note that whatever any of the above-mentioned struct's members would be pointing to must be available throughout the running time of the host application. This means that the use of non-static local variables may destabilize the application and may result in a crash, since the memory space may be reclaimed as soon as the subroutine is exited. Here are some brief explanatory text about the members of the RESOURCE struct:

  1. pzLanguage: pointer to a zero-terminated string identifying the name of the language.
  2. paVoices: pointer to an array of voices the language pack comes with. You can have a static array within your code that you can point this member to.
  3. nVoicesCount: number of individual voices in the array that paVoices is pointing to.
  4. pzActiveVoice (optional): pointer to the default voice. This MUST point to a member in the array paVoices is pointing to. If you point it elsewhere, it simply won't work!
  5. hInstance: handle of your DLL instance. You MUST not set a value to this member. The value will be set by the host application for you when it initializes your DLL. However, a wacko developer will abuse this rule and set it to the handle of instance passed to the DllMain() function, which will still be fine.
  6. pfPlayTimeProc: pointer to the function that tells the time. This function will be called by the host application when the current time needs to be announced. The function is actually called in a new thread that is why it has that declaration. The DLL must tell the current local time returned by GetLocalTime() but not GetSystemTime(), which is quite different.

If you understand the nature of the RESOURCE struct above then you are almost ready to start writing your language pack. In addition to that, your language pack DLL must have the following functions implemented as well:

__declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID);
__declspec(dllexport) BOOL Initialize(PRESOURCE);

The DllMain() function is, of course, going to be called by Windows to perform any startup procedures for your DLL. The Initialize() function is what the Abosen Time Teller host application will call. Like the DllMain(), the Initialize() function must return TRUE to signal successful initialization, otherwise the DLL will not be loaded. The PRESOURCE argument will be a pointer to the resource in the host application's memory space. A language pack MUST save this pointer so as to know details like the selected voice by the user, etc.

As you may have noticed already, the Initialize() function is the only symbol that needs to be exported from your DLL in order to be callable by the host application. Any other member variables or functions you may use are not required to be exported. You do not even need to have DllMain() if you are compiling with GCC. I don't know about MSVC and the rest, though.


abosen-0.1.1.zipAbosen 0.1.1 Windows installer5.36 MB
abosen-0.1.1-src.zipAbosen 0.1.1 complete source code8.09 MB

The license that comes with this software (both the source code and compiled binaries) allows you to distribute, remix, tweak, and build upon your work, even commercially, as long as you credit the author for the original creation. See the in-package LICENSE.txt for additional information.

Comments (3)

February 16, 2013 at 23:29 GMT

This is an amazing piece for the african continent...kudos...!!

February 17, 2013 at 09:56 GMT

Finally you have done it congratulations boss I wish I was the voice man thanks a lot
This is awesome

Michael Kwayisi
February 17, 2013 at 11:05 GMT

Thanks guys. But let's make this a catalyst for developing *real* FREE and open source software in Ghana. We can still make money from developing commercial software, but let's try to pay our dues as well. "May we share freely, never taking more than we give."

More: Related content On the Web »
Copyright © 2016 Michael Kwayisi